如何将具有相同列值的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行分组为一行?的主要内容,如果未能解决你的问题,请参考以下文章