SQLite中的GROUP_CONCAT

14

我有这样的数据

1 A
1 B
1 C
1 D
2 E
2 F
3 G
3 H
3 I
3 J
3 K

通过使用这个查询

select ABSTRACTS_ITEM._id,Name 
from ABSTRACTS_ITEM , ABSTRACT_AUTHOR , AUTHORS_ABSTRACT
where
ABSTRACTS_ITEM._id = AUTHORS_ABSTRACT.ABSTRACTSITEM_ID
and
ABSTRACT_AUTHOR._id = AUTHORS_ABSTRACT.ABSTRACTAUTHOR_ID

现在,我想展示如下的数据

1 A,B,C,D
2 EF

等等之类的……我还知道可以通过GROUP_CONCAT函数实现。所以,我试着用它来做。

SELECT ABSTRACTS_ITEM._id,
GROUP_CONCAT(ABSTRACT_AUTHOR.NAME) FROM
(select ABSTRACTS_ITEM._id,
Name
from
ABSTRACTS_ITEM , ABSTRACT_AUTHOR , AUTHORS_ABSTRACT
where
ABSTRACTS_ITEM._id = AUTHORS_ABSTRACT.ABSTRACTSITEM_ID
and
ABSTRACT_AUTHOR._id = AUTHORS_ABSTRACT.ABSTRACTAUTHOR_ID)

但是,它显示出错误信息。那么,我在这里做错了什么?实现这一目标的正确流程是什么?

2个回答

24

当你使用聚合函数时,需要添加GROUP BY子句。同时使用JOIN来连接表。

所以尝试这样做:

SELECT AI._id, GROUP_CONCAT(Name) AS GroupedName
  FROM ABSTRACTS_ITEM AI 
  JOIN AUTHORS_ABSTRACT AAB ON AI.ID = AAB.ABSTRACTSITEM_ID
  JOIN ABSTRACT_AUTHOR AAU ON AAU._id = AAB.ABSTRACTAUTHOR_ID
 GROUP BY tbl._id;
请查看这个样本SQLFiddle

你的尝试几乎是正确的。你只需要在结尾添加GROUP BY子句即可。但第一个更好。
SELECT ID,
GROUP_CONCAT(NAME) 
FROM
    (select ABSTRACTS_ITEM._id AS ID,
     Name
     from
    ABSTRACTS_ITEM , ABSTRACT_AUTHOR , AUTHORS_ABSTRACT
    where
    ABSTRACTS_ITEM._id = AUTHORS_ABSTRACT.ABSTRACTSITEM_ID
    and
    ABSTRACT_AUTHOR._id = AUTHORS_ABSTRACT.ABSTRACTAUTHOR_ID)
GROUP BY ID;

0

这是我对这个已关闭的问题的回答(其中有一个很好的展示)。SQL按行分组结果

您必须向所选字段添加聚合函数。
您想要的是:GROUP_CONCAT 使用自定义SEPARATOR ', '

请参阅相关的MySQL文档: https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html

您的选择查询将如下所示:

SELECT id_place, placename, GROUP_CONCAT(plant_name SEPARATOR ', ') AS 'plantnames'
FROM BLOOM
JOIN PLACE ON id_place = fk_place
JOIN PLANT ON id_plant = fk_plant
GROUP BY id_place, placename;

然后你会得到你想要的输出:

id_place placename plantnames
1 纽约 兰花,郁金香
2 伦敦 玫瑰树,兰花,郁金香
3 巴黎 玫瑰树,百合花,紫罗兰
这里有一个DB Fiddle可以检查一下(MySQL 8.0): https://www.db-fiddle.com/f/sSU7G4kKEaxsLMNweAtLSA/2

MySQL的GROUP_CONCAT与SQLite的版本不兼容。 - dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接