我有这个查询可以正常工作(在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查询,我可以提取属于一个类别的所有项目,对于每个项目,我都可以提取所有相应的图像。
现在,我正在尝试更新/升级此查询,并尝试还获取该项目(属于某个类别的每个项目)的视频(如果有)。
我能够按以下方式升级查询,但是它给了我一个奇怪的结果,显然我在以错误的方式进行查询..但是我不知道我在做什么错。.
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
此查询返回我(如果存在某些视频)相同数量的视频和图像...如果该项目包含3个图像,则它也返回3个视频,这是不正确的,因为某些项目可能包含3个图像和1个视频,反之亦然..您能帮我解决该查询吗?
答案 0 :(得分:2)
最简单的解决方案是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;
注意:
distinct
关键字应删除两个列表中的重复项。g.id AS id_galleria
。这是不合适的,因为有多个匹配项。您可以在g.id
(例如MIN()
,MAX()
或GROUP_CONCAT()
)上使用聚合函数。GROUP BY a.id
是表中的主键(或唯一键),并且唯一未聚合的列来自该表,则id
很好。此外,如果您有少量的图像和图库,DISTINCT
也可以使用。如果数据量较大,则可能需要其他策略,例如在加入之前进行汇总。