【问题标题】:MySQL - Query combine rows with same id and keep all entry for that id but as one recordMySQL - 查询组合具有相同 ID 的行并保留该 ID 的所有条目但作为一条记录
【发布时间】:2012-11-05 12:35:59
【问题描述】:

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

谁能帮我制作一张包含许多植物记录的表格。一个植物可以有多个名称,该表将其显示为不同的记录。该表名为 new_plantsname

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

这会持续超过 3000 条记录

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

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

结果:

谁能帮忙

【问题讨论】:

  • 是的,我不,它在这里工作,但是当我在 wamp 的 phpmyadmin 中运行它时,它不会给出结果,它只给我名字,其余部分为 null
  • 我建议你没有得到你在这里说的相同的数据结构。因此,我认为由你来制定下一阶段。前面给出的示例在上面的演示中显然有效。如果做不到这一点,也许 phpmyadmin 无法正确处理查询。您是否尝试过在不同的管理工具中运行查询???

标签: mysql sql phpmyadmin wampserver


【解决方案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

并将其用作子查询。

【讨论】:

    猜你喜欢
    • 2017-05-05
    • 2012-11-04
    • 2022-10-05
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多