我有一个产品表,想要选择所有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()不能单独使用?
答案 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