13

私はクエリを実行するためにwampでphpmyadmin領域を使用しているwampサーバーでローカルに保持されているmysqlデータベースのテーブルで作業しています。次のことを行うためのデータを取得しようとしています。

植物の多数のレコードを含むテーブルを持っているのを手伝ってくれる人はいますか? 植物は、テーブルが異なるレコードとしてこれを示すいくつかの名前を持つことができます。テーブルは new_plantsname と呼ばれます

plantid name
1       tree
1       rose
2       bush
3       tree
3       bush
3       rose

これは3000以上のレコードで続いています

私が望むのは、同じ plantid を持つレコードを結合し、異なる列に異なる名前を表示することです:

plantid name1 name2 name3 ...
1       tree  rose  NULL
2       shrub NULL  NULL
3       tree  rose  bush 

一見すると、植物には4つ以上の名前がないと思います。

これを行うためのクエリを手伝ってもらえますか。結果を新しいテーブルに保存したい

誰かが私に答えとして次のことを教えてくれました:

select plantid,
  max(case when nameRn = 'name1' then name end) Name1,
  max(case when nameRn = 'name2' then name end) Name2,
  max(case when nameRn = 'name3' then name end) Name3,
  max(case when nameRn = 'name4' then name end) Name4
from
(
  select plantid, name,
      concat('name', @num := if(@plantid = `plantid`, @num + 1, 1)) as nameRn,
      @plantid := `plantid` as dummy
  from
  (
    select plantid, name, @rn:=@rn+1 overall_row_num
    from yourtable, (SELECT @rn:=0) r
  ) x
  order by plantid, overall_row_num
) src
group by plantid;

これはエラーなしで機能しているように見えますが、最初のレコードの名前のみを保持し、残りのレコードではなく id を保持するレコードを結合しませんでした。使用データ:

plantid     name
    1       tree
    1       rose
    2       tree
    3       rose
    3       bush
    3       rose

結果:

結果は、名以外のすべてにnullが追加されたことを示しています

誰でも助けてくれますか

4

1 に答える 1

23

問題は、MySQL には行を列挙する適切な方法がないことです。残念ながら、MySQL のドキュメントによると、定数の使用は保証されていません。多くの場合、うまくいきますが、問題になることもあります。

名前を 1 つのフィールドに連結することをお勧めします。結果は次のようになります。

1     tree,rose
2     tree
3     tree,bush,rose

SQL の使用:

select plantid, group_concat(name separator ',')
from t
group by plantid

名前を別々の列に表示したい場合は、2 つのオプションが思い浮かびます。1 つは、上記の結果を使用して、結果を個別の文字列に解析することです。もう 1 つの方法は、次のように、自己結合と集計を使用して連番を計算することです。

select p.plantid, p.name, count(*) as seqnum
from t p left outer join
     t pprev
     on p.plantid = pprev.plantid and
        p.name >= pprev.name
group by p.plantid, p.name

これをサブクエリとして使用します。

于 2012-11-16T22:59:48.060 に答える