首页 > 解决方案 > group-concat问题,结果错误

问题描述

我有这个可以正常工作的查询(在 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 个视频,反之亦然.. 可以你帮我解决查询?

标签: mysqlsqlgroup-concat

解决方案


最简单的解决方案是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如果您有少量图像和画廊,则可以使用这些作品。如果您有大量数据,则可能需要另一种策略,例如在加入之前进行聚合。


推荐阅读