我有3个表,帖子,标签和post_tags。帖子和标签有很多关系。
posts table
+----+------------------------------------------------------+
| id | title |
+----+------------------------------------------------------+
| 1 | title1 |
| 2 | title2 |
| 3 | title3 |
+----+------------------------------------------------------+
post_tags table
+----+---------+--------+
| id | post_id | tag_id |
+----+---------+--------+
| 1 | 1 | 2 |
| 2 | 1 | 3 |
| 3 | 1 | 4 |
| 4 | 2 | 2 |
| 5 | 2 | 4 |
| 6 | 2 | 5 |
| 7 | 2 | 6 |
| 8 | 3 | 3 |
| 9 | 3 | 4 |
| 10 | 3 | 5 |
+----+---------+--------+
所以,我需要根据tag_id查找帖子,如果我只有一个标签,解决方案似乎很容易。
SELECT posts.id, posts.title
FROM posts
INNER JOIN post_tags
ON posts.id = post_tags.post_id
AND post_tags.tag_id = 2
所以,我只获得post_tags表中包含tag_id 2的帖子。所以,现在我想只获取那些同时拥有tag_id 2和3的帖子。我的意思是,如果某些帖子有tag_id 2而不是3,则不应提取这些帖子。我怎样才能做到这一点?
我试过这个
SELECT posts.id, posts.title
FROM posts
INNER JOIN post_tags
ON posts.id = post_tags.post_id
AND post_tags.tag_id = 2
AND post_tags.tag_id = 3
但它返回空,我想我可以理解为什么,因为它似乎为同一个tag_id字段制作了两个和条件。
更新
此查询返回所有包含tag_id 2 OR 3的帖子,但需要2 AND 3
SELECT posts.id, posts.title
FROM posts
INNER JOIN post_tags
ON posts.id = post_tags.post_id AND post_tags.tag_id IN (2,3);
由于
答案 0 :(得分:1)
也许这样的事情可以帮助你做到这一点
select posts.id, posts.title
from posts
INNER JOIN post_tags
ON posts.id = post_tags.post_id
group by posts.id
having max(post_tags.tag_id=2) > 0
and max(post_tags.tag_id=3) > 0
您可以查看解决方案here
答案 1 :(得分:1)
你可以这样做
SELECT p.id, p.title
FROM post p JOIN post_tags t
ON p.id = t.post_id
WHERE t.tag_id IN (2, 3)
GROUP BY p.id, p.title
HAVING COUNT(DISTINCT t.tag_id) = 2
输出:
| ID | TITLE | --------------- | 1 | title1 |
这是 SQLFiddle 演示
答案 2 :(得分:0)
使用IN子句
SELECT posts.id, posts.title FROM posts INNER JOIN post_tags ON posts.id = post_tags.post_id AND post_tags.tag_id IN (2,3);
这可能对你有用