zar*_*jlc 11 mysql sql phpmyadmin wampserver
我一直在一个在一个wql服务器本地保存的mysql数据库中的表上工作我正在使用phpmyadmin区域在wamp中运行查询.我试图让数据执行以下操作:
任何人都可以帮助我有一个包含许多植物记录的表格.工厂可以有许多名称,表格将其显示为不同的记录.该表名为new_plantsname
plantid name
1 tree
1 rose
2 bush
3 tree
3 bush
3 rose
Run Code Online (Sandbox Code Playgroud)
这持续超过3000条记录
我想要的是将记录与相同的plantid组合在一起,并在不同的列中显示不同的名称:
plantid name1 name2 name3 ...
1 tree rose NULL
2 shrub NULL NULL
3 tree rose bush
Run Code Online (Sandbox Code Playgroud)
等等
我一眼就相信一家工厂的名字不超过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;
Run Code Online (Sandbox Code Playgroud)
这似乎工作,虽然没有错误,但它没有结合记录,它只保留第一个记录的名称与id而不是其余的.使用数据:
plantid name
1 tree
1 rose
2 tree
3 rose
3 bush
3 rose
Run Code Online (Sandbox Code Playgroud)
结果:

谁能帮忙
Gor*_*off 16
问题是MySQL没有很好的枚举行的方法.根据MySQL文档,使用常量并不能保证能够正常工作.它通常可行,但也可能有问题.
我建议你将这些名称连接成一个字段.结果如下:
1 tree,rose
2 tree
3 tree,bush,rose
Run Code Online (Sandbox Code Playgroud)
使用SQL:
select plantid, group_concat(name separator ',')
from t
group by plantid
Run Code Online (Sandbox Code Playgroud)
如果你真的想要在不同的列中使用这些名称,我会想到两个选项.一种是使用上面的结果,然后将结果解析为单独的字符串.另一种方法是使用自联接和聚合来计算序列号,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
并使用它作为子查询.
| 归档时间: |
|
| 查看次数: |
17085 次 |
| 最近记录: |