【问题标题】:GROUP_CONCAT() can't be used by itself?GROUP_CONCAT() 不能单独使用?
【发布时间】:2015-12-09 16:45:27
【问题描述】:

我有一个产品表,想选择所有的 ID 作为逗号分隔的字符串。当我运行以下查询时:

SELECT GROUP_CONCAT(p.id SEPARATOR ',') FROM products p GROUP BY 1

我收到错误:

不能在 'GROUP_CONCAT(p.id SEPARATOR ',')' 上分组

但是,如果我将查询更改为:

SELECT id, GROUP_CONCAT(p.id SEPARATOR ',') FROM products p GROUP BY 1

然后它为每个产品返回一行,其中包含两列,每列中都有一个匹配的产品 ID。这不是我想要的,但我显示此查询是为了证明选择附加列会导致错误消失。

为什么不能单独使用GROUP_CONCAT()?

【问题讨论】:

标签: mysql aggregate-functions


【解决方案1】:

如果您想将 所有 找到的行归为一个,则根本不需要 GROUP BY 子句。

来自docs

如果在不包含 GROUP BY 子句的语句中使用分组函数,则相当于对所有行进行分组。

你应该能够做到:

SELECT GROUP_CONCAT(p.id SEPARATOR ',') FROM products p

注意SEPARATOR ','默认,你可以使用:

SELECT GROUP_CONCAT(p.id) FROM products p

根据SELECT 语句的docs,您可以将位置 传递给GROUP BY,它将按该列分组。

可以使用列名、列别名或列位置在 ORDER BY 和 GROUP BY 子句中引用为输出选择的列。列位置是整数并以 1 开头 [...] 不推荐使用列位置,因为该语法已从 SQL 标准中删除。

所以,GROUP BY 1 被解释为GROUP BY GROUP_CONCAT(p.id SEPARATOR ','),这没有任何意义。

【讨论】:

  • 我认为聚合函数需要GROUP BY 子句。谢谢你教育我!
【解决方案2】:

这样做:

create table products (id int);
insert into products values (1), (2), (3);
select group_concat(id separator ',') from products;

结果:

+--------------------------------+
| group_concat(id separator ',') |
+--------------------------------+
| 1,2,3                          |
+--------------------------------+

【讨论】:

    【解决方案3】:

    要使 GROUP BY 正常工作,您需要用于分组的列,并且该列需要包含在所选字段中。当你写 GROUP By 1 时,它实际上是按第一列分组。

    如果您只想对所有行进行分组(而不是按任何列),您可以使用对所有行都相同的虚拟列。像这样:

    SELECT 'test', GROUP_CONCAT(p.id SEPARATOR ',') FROM products p GROUP BY 1
    

    或者完全删除 GROUP BY

    SELECT GROUP_CONCAT(p.id SEPARATOR ',') FROM products p
    

    【讨论】:

    • 或者...您可以完全删除GROUP BY 1
    • @RocketHazmat 正确
    【解决方案4】:

    使用时:

    SELECT id, GROUP_CONCAT(p.id SEPARATOR ',') FROM products p GROUP BY 1
    

    您正在按 Id 分组

    如果这是你想要的,你可以试试:

    SELECT GROUP_CONCAT(p.id SEPARATOR ',') FROM products p GROUP BY id
    

    如果您只需要一行,所有 Id 都用“,”分隔,您只需要:

    SELECT GROUP_CONCAT(id) FROM products
    

    【讨论】:

    • No, I just included the query at the end to show that the error goes away when another column is selected.你的第二个查询不是和SELECT ID from products做同样的事情吗?
    • @Nate 如果这不是您所需要的,请编辑您的问题并说明您需要什么:您要分组什么?
    • I have a table of products and want to select all the IDs as a comma separated string
    • @Nate 我编辑了我的答案。现在我认为这就是你所需要的
    猜你喜欢
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2012-09-21
    • 2020-05-21
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多