如何将具有相同列值的mysql行分组为一行?

Posted

技术标签:

【中文标题】如何将具有相同列值的mysql行分组为一行?【英文标题】:How to group mysql rows with same column value into one row? 【发布时间】:2011-04-09 12:40:12 【问题描述】:

我有两个表,关键字和数据。

表格关键字有2列(id,keyword),表格数据有3列(id[关键字的外键.id],name,value)。

我正在使用这个查询:

SELECT k.id, d.value, d.name
FROM keywords AS k
INNER JOIN data as d ON k.id = d.id

它返回类似:

1 123 name1
1 456 name2
2 943 name1
3 542 name1
3 532 name2
3 682 name3

每个 id 可以有从 0 到 3 的值(将来可能更多)。

如何检索同一行中具有相同 id 的所有行?

喜欢

1 123 456
2 943
3 542 532 682

我想这样做是因为我希望能够对值进行排序。

【问题讨论】:

这种转换确实比在应用程序端做的更好,而不是让 mysql 做。 我同意 Amber 的观点,但如果您仍然只想使用 SQL,嗯.. 我会在谷歌上搜索“concat”和“group by”sql 函数的详细信息。 我想这样做是因为我希望能够对值进行排序,所以如果我可以直接从 mysql 中对其进行排序就好了。你知道我怎样才能轻松地对存储在 php 数组中的每一列进行排序吗? 您希望如何存储它们?如果您将它们与 GROUP BY... 连接在一起,则不一定保证顺序一致。 【参考方案1】:

像这样使用GROUP_CONCAT()

 SELECT k.id, GROUP_CONCAT(d.value)
  FROM keywords AS k
  INNER JOIN data as d ON k.id = d.id
  GROUP BY k.id

此外,您可能需要执行ORDER BY d.name 才能获得所需的确切值顺序。像这样:

 SELECT k.id, GROUP_CONCAT(d.value ORDER BY d.name separator ' ')
  FROM keywords AS k
  INNER JOIN data as d ON k.id = d.id
  GROUP BY k.id

【讨论】:

你忘记GROUP BY k.id了吗? @Jarkam,因为您没有在此查询中使用 GROUP BY k.id 有没有办法可以检索不同列中的值? 就像 ONE 列中的逗号分隔值而不是逗号分隔值,每个值都有不同的列。 您可以用 anything 分隔值替换逗号分隔值。请参阅SEPARATOR ' ' 的新示例,它将按空格分隔值。如果您真的想以非常不同的方式显示它们,您可以通过服务器端语言(Perl、PHP 等)将逗号分隔的值拆分为单独的值,并以您想要的任何方式显示。在 PHP 中,这可以通过 explode(',', $csv); 完成

以上是关于如何将具有相同列值的mysql行分组为一行?的主要内容,如果未能解决你的问题,请参考以下文章

mysql连接具有相同列值的两行并计算某些列值并返回一行中的所有行

如何在MySql中返回具有相同列值的行

PostgreSQL,删除具有重新编号列值的行

pandas-对列中具有相同值的连续行进行分组和聚合

对具有空值和不同值的行进行分组

SQL / Hive 选择具有特定列值的第一行