小编典典

MySQL-查询将具有相同ID的行合并,并保留该ID的所有条目但作为一条记录

sql

我一直在在mysql数据库中的一个表上工作,该表被本地保存在wamp服务器上,我正在wamp中使用phpmyadmin区域来运行查询。我正在尝试获取数据来执行以下操作:

任何人都可以帮我建立一张带有许多工厂记录的表格。植物可以具有多个名称,该表将其显示为不同的记录。该表称为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;

这似乎可以正常工作,但没有错误,但是它没有合并记录,只保留了第一个记录的名称,而没有保留其他记录。使用的数据:

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

结果:

结果显示为除名字外的所有名字添加了null

谁能帮忙


阅读 211

收藏
2021-04-17

共1个答案

小编典典

问题是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

并将其用作子查询。

2021-04-17