首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL -查询合并具有相同id的行,并保留该id的所有条目,但作为一条记录

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

Stack Overflow用户
提问于 2012-11-17 02:38:58
回答 1查看 20.2K关注 0票数 13

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

有人能帮我吗?我有一张表,里面有许多植物的记录。一种植物可以有许多名称,表中将其显示为不同的记录。该表名为new_plantsname

代码语言:javascript
复制
plantid name
1       tree
1       rose
2       bush
3       tree
3       bush
3       rose

这种情况持续了3000多条记录

我想要的是合并具有相同plantid的记录,并在不同的列中显示不同的名称:

代码语言:javascript
复制
plantid name1 name2 name3 ...
1       tree  rose  NULL
2       shrub NULL  NULL
3       tree  rose  bush 

等

乍一看,我认为一株植物的名字不超过4个。

可以帮助我的查询做到这一点。我还想将结果保存到新表中

有人给了我以下答案:

代码语言:javascript
复制
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,而不是其余的记录。使用的数据:

代码语言:javascript
复制
plantid     name
    1       tree
    1       rose
    2       tree
    3       rose
    3       bush
    3       rose

结果:

​

​

有人能帮上忙吗

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-17 06:59:48

问题是MySQL没有一种很好的枚举行的方法。根据MySQL文档,并不能保证常量的使用会起作用。它通常是有效的,但也可能是有问题的。

我建议您将这些名称连接到一个字段中。结果将如下所示:

代码语言:javascript
复制
1     tree,rose
2     tree
3     tree,bush,rose

使用SQL:

代码语言:javascript
复制
select plantid, group_concat(name separator ',')
from t
group by plantid

如果你真的想把名字放在单独的列中,有两个选择会出现在脑海中。一种是使用上面的结果,然后将结果解析为单独的字符串。另一种方法是使用自联接和聚合来计算序列号,如下所示:

代码语言:javascript
复制
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

并将其用作子查询。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13422461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档