组群冲突的问题,结果是错误的

时间:2019-04-13 13:09:53

标签: mysql sql 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个视频,反之亦然..您能帮我解决该查询吗?

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也可以使用。如果数据量较大,则可能需要其他策略,例如在加入之前进行汇总。