我最近加入了一个项目。我正在检查代码,我遇到了这个问题:
SELECT p.*
FROM posts p
INNER JOIN pivot pi1 on p.id = pi1.post_id
INNER JOIN tags t1 on t1.id = pi1.tag_id and t1.name = "mysql"
INNER JOIN pivot pi2 on p.id = pi2.post_id
INNER JOIN tags t2 on t2.id = pi2.tag_id and t2.name = "php"
选择所有标有mysql
和php
标记的帖子。我的问题是关于加入。为什么要两次加入pivot
表?为什么不加入pivot
一次并将其用于标记两次?
答案 0 :(得分:2)
如果您想使用聚合,可以加入数据透视表一次:
SELECT p.*
FROM posts p
INNER JOIN pivot pi
ON p.id = pi.post_id
INNER JOIN tags t
ON t.id = pi.tag_id AND t.name IN ('mysql', 'php')
GROUP BY p.id
HAVING COUNT(*) = 2;
在您的版本中,pivot
中的一行无法匹配这两个值。所以,你需要两个连接。