我一直在在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
结果:
谁能帮忙
问题是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
并将其用作子查询。