group-concat问题,结果不对
Group-concat problems, the result is wrong
我有这个查询可以正常工作(在 phpmyadmin 上测试):
SELECT articoli.id AS id_articoli,
articoli.titolo,
articoli.descrizione,
galleria.id AS id_galleria,
group_concat(galleria.foto) as immagini
FROM articoli
LEFT JOIN galleria
ON articoli.id = galleria.rif_id
WHERE articoli.genere1 = 1
AND articoli.visibile = 1
GROUP BY articoli.id
ORDER BY articoli.id ASC
通过这个 mysql 查询,我可以获取属于一个类别的所有项目,并且对于每个项目,我可以获取所有相应的图像。
现在我正在尝试 update/upgrade 此查询并尝试获取该项目的视频(如果有的话)(这适用于属于某个类别的每个项目)。
我能够按如下方式升级查询,但它给了我一个奇怪的结果,显然我以错误的方式进行查询..但我不知道我做错了什么..
SELECT articoli.id AS id_articoli,
articoli.titolo,
articoli.descrizione,
galleria.id AS id_galleria,
group_concat(galleria.foto) as immagini,
group_concat(videos.video) as video
FROM articoli
LEFT JOIN galleria
ON articoli.id = galleria.rif_id
LEFT JOIN videos
ON articoli.id = videos.rif_id
WHERE articoli.genere1 = 1
AND articoli.visibile = 1
GROUP BY articoli.id
ORDER BY articoli.id ASC
此查询 returns 我(如果存在某些视频)相同数量的视频和图像...如果该项目有 3 张图像,它 returns 也有 3 个视频,但事实并非如此,因为一些item 可以有 3 张图片和 1 个视频,反之亦然。你能帮我解决这个问题吗?
最简单的解决方案是DISTINCT
:
SELECT a.id AS id_articoli,
a.titolo,
a.descrizione,
group_concat(distinct g.foto) as immagini,
group_concat(distinct v.video) as video
FROM articoli a LEFT JOIN
galleria g
ON a.id = g.rif_id LEFT JOIN
videos v
ON a.id = v.rif_id
WHERE a.genere1 = 1 AND
a.visibile = 1
GROUP BY a.id
ORDER BY a.id ASC;
备注:
- 我添加了 table 个别名。这使得查询更易于编写和阅读。
distinct
关键字应删除两个列表中的重复项。
- 我删除了
g.id AS id_galleria
。这是不合适的,因为有多个匹配项。您可以在 g.id
(例如 MIN()
、MAX()
或 GROUP_CONCAT()
)上使用聚合函数。
-
GROUP BY a.id
很好,假设 id
是 table 中的主键(或唯一键),并且唯一未聚合的列来自 table。
此外,如果您有少量图像和画廊,DISTINCT
也适用。如果您有大量数据,则可能需要另一种策略,例如在加入之前进行聚合。
我有这个查询可以正常工作(在 phpmyadmin 上测试):
SELECT articoli.id AS id_articoli,
articoli.titolo,
articoli.descrizione,
galleria.id AS id_galleria,
group_concat(galleria.foto) as immagini
FROM articoli
LEFT JOIN galleria
ON articoli.id = galleria.rif_id
WHERE articoli.genere1 = 1
AND articoli.visibile = 1
GROUP BY articoli.id
ORDER BY articoli.id ASC
通过这个 mysql 查询,我可以获取属于一个类别的所有项目,并且对于每个项目,我可以获取所有相应的图像。
现在我正在尝试 update/upgrade 此查询并尝试获取该项目的视频(如果有的话)(这适用于属于某个类别的每个项目)。
我能够按如下方式升级查询,但它给了我一个奇怪的结果,显然我以错误的方式进行查询..但我不知道我做错了什么..
SELECT articoli.id AS id_articoli,
articoli.titolo,
articoli.descrizione,
galleria.id AS id_galleria,
group_concat(galleria.foto) as immagini,
group_concat(videos.video) as video
FROM articoli
LEFT JOIN galleria
ON articoli.id = galleria.rif_id
LEFT JOIN videos
ON articoli.id = videos.rif_id
WHERE articoli.genere1 = 1
AND articoli.visibile = 1
GROUP BY articoli.id
ORDER BY articoli.id ASC
此查询 returns 我(如果存在某些视频)相同数量的视频和图像...如果该项目有 3 张图像,它 returns 也有 3 个视频,但事实并非如此,因为一些item 可以有 3 张图片和 1 个视频,反之亦然。你能帮我解决这个问题吗?
最简单的解决方案是DISTINCT
:
SELECT a.id AS id_articoli,
a.titolo,
a.descrizione,
group_concat(distinct g.foto) as immagini,
group_concat(distinct v.video) as video
FROM articoli a LEFT JOIN
galleria g
ON a.id = g.rif_id LEFT JOIN
videos v
ON a.id = v.rif_id
WHERE a.genere1 = 1 AND
a.visibile = 1
GROUP BY a.id
ORDER BY a.id ASC;
备注:
- 我添加了 table 个别名。这使得查询更易于编写和阅读。
distinct
关键字应删除两个列表中的重复项。- 我删除了
g.id AS id_galleria
。这是不合适的,因为有多个匹配项。您可以在g.id
(例如MIN()
、MAX()
或GROUP_CONCAT()
)上使用聚合函数。 -
GROUP BY a.id
很好,假设id
是 table 中的主键(或唯一键),并且唯一未聚合的列来自 table。
此外,如果您有少量图像和画廊,DISTINCT
也适用。如果您有大量数据,则可能需要另一种策略,例如在加入之前进行聚合。