【发布时间】:2021-06-02 15:51:47
【问题描述】:
结果: 我用了三种方法:
- 三个子查询,每个查询 1 个(我的)
- 三个子查询,无join,用where过滤(SlimsGhost)
- 三重连接 (Solarflare)
我用“解释”和“分析”做了一些统计,解释了每个查询必须做的工作,以下结果并不令人惊讶:stats
相对结果:
原帖
这个想法是连接 4 个表,每次使用相同的 PK,然后计算每个连接分别给出多少行。
显而易见的答案是使用子查询单独执行每个连接。
但是有可能用一个查询来完成吗?会不会更有效率?
select "LES CIGARES DU PHARAON" as "Titre",
(select count( payalb.idPays)
from album alb
left join pays_album payalb using ( idAlb )
where alb.titreAlb = "LES CIGARES DU PHARAON") as "Pays",
(select count( peralb.idPers)
from album alb
left join pers_album peralb using ( idAlb )
where alb.titreAlb = "LES CIGARES DU PHARAON") as "Personnages",
(select count( juralb.idJur)
from album alb
left join juron_album juralb using ( idAlb )
where alb.titreAlb = "LES CIGARES DU PHARAON") as "Jurons"
;
+------------------------+------+-------------+--------+
| Titre | Pays | Personnages | Jurons |
+------------------------+------+-------------+--------+
| LES CIGARES DU PHARAON | 3 | 13 | 50 |
+------------------------+------+-------------+--------+
表相册行数:22
table pays_album 行数:45
table personnage_album 行数:100
表 juron_album 行:1704
这是我尝试过的:
select alb.titreAlb as "Titre",
sum(case when alb.idAlb=payalb.idAlb then 1 else 0 end) "Pays",
sum(case when alb.idAlb=peralb.idAlb then 1 else 0 end) "Personnages",
sum(case when alb.idAlb=juralb.idAlb then 1 else 0 end) "Jurons"
from album alb
left join pays_album payalb using ( idAlb )
left join pers_album peralb using ( idAlb )
left join juron_album juralb using ( idAlb )
where alb.titreAlb = "LES CIGARES DU PHARAON"
group by alb.titreAlb
;
+------------------------+------+-------------+--------+
| Titre | Pays | Personnages | Jurons |
+------------------------+------+-------------+--------+
| LES CIGARES DU PHARAON | 1950 | 1950 | 1950 |
+------------------------+------+-------------+--------+
但它会计算完整连接表的总行数,... (1950 = 3 * 13 * 50)
架构:https://github.com/LittleNooby/gbd2015-2016/blob/master/tintin_schema.png
表格内容:https://github.com/LittleNooby/gbd2015-2016/blob/master/tintin_description
如果你想玩玩它:
db_init : https://github.com/LittleNooby/gbd2015-2016/blob/master/tintin_ok.mysql
【问题讨论】:
-
我想查看专辑表中的一些示例数据。为什么要这样做?
-
为了优化和知道是否可以供以后使用。 (显然这个数据库是用来练习的)我编辑了帖子以提供指向“表格内容”的链接
-
如果您制作了一个 sqlfiddle 而不是链接到文本文件,那将会很有帮助。
-
如果您只是使用
COUNT(*),有一些方法可以简化它。但我不确定它们是否适用于您进行这样的旋转。 -
sqlfiddle 似乎不喜欢我的数据库架构,反正我似乎有我的答案,是时候阅读了。
标签: mysql join optimization