mysql - 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 个视频,反之亦然.. 可以你帮我解决查询?
解决方案
最简单的解决方案是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
如果您有少量图像和画廊,则可以使用这些作品。如果您有大量数据,则可能需要另一种策略,例如在加入之前进行聚合。
推荐阅读
- electron - 捆绑多个现有项目
- javascript - 如何仅在单击时将字母的颜色更改为白色
- mysql - 查找并分组同一个月的所有记录,相隔 1 年
- reactjs - React:保存状态更新 DOM 但不更新控制台
- jupyter-notebook - Jupyter 中的 Julia:内核错误(“无法在 IJulia 中预编译”)
- entity-framework-core - 如何在 EF Core v3 中进行左外连接
- ios - 将功能添加到 Watch Extension 时 Xcode 崩溃
- r - Closest other Value in the same Vector
- typescript - 在 Jest 和 TypeScript 中使用可选参数模拟函数
- sql - 为存储过程中的变量赋值