簡體   English   中英

MySQL - Query組合具有相同id的行並保留該id的所有條目,但作為一條記錄

[英]MySQL - Query combine rows with same id and keep all entry for that id but as one record

我一直在一個在一個wql服務器本地保存的mysql數據庫中的表上工作我正在使用phpmyadmin區域在wamp中運行查詢。 我試圖讓數據執行以下操作:

任何人都可以幫助我有一個包含許多植物記錄的表格。 工廠可以有許多名稱,表格將其顯示為不同的記錄。 該表名為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

誰能幫忙

問題是MySQL沒有很好的枚舉行的方法。 根據MySQL文檔,使用常量並不能保證能夠正常工作。 它通常可行,但也可能有問題。

我建議你將這些名稱連接成一個字段。 結果如下:

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

使用SQL:

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

如果你真的想要在不同的列中使用這些名稱,我會想到兩個選項。 一種是使用上面的結果,然后將結果解析為單獨的字符串。 另一種方法是使用自聯接和聚合來計算序列號,如下所示:

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

並使用它作為子查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM