GROUP_CONCAT()不能单独使用?

时间:2015-12-09 16:45:28

标签: mysql aggregate-functions

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

/^Error/ {print $0 > "errorFile.txt" 

我收到错误:

  

无法分组'GROUP_CONCAT(p.id SEPARATOR',')'

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

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

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

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

4 个答案:

答案 0 :(得分:2)

如果您想将所有找到的行分组为一个,那么您根本不需要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 ','),这没有任何意义。

答案 1 :(得分: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                          |
+--------------------------------+

答案 2 :(得分:1)

使用时:

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

答案 3 :(得分:1)

要使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