根据MySQL中的相关表选择数据

时间:2013-11-21 15:36:17

标签: php mysql sql relational-database entity-relationship

我有以下表格:

posts
---------------------
id   |   name
---------------------
1    |   First Post
2    |   Another post 

tags
---------------------
id   |   name
---------------------
1    |   Tag1
2    |   Tag2
3    |   Tag3

posts_tags
---------------------
post_id | tag_id
---------------------
1       |   2
1       |   3
2       |   1
3       |   2

我正在尝试编写一个查询(用人类可读的术语)会说“查找所有标记为tag1或tag2的帖子”。

因此,我可以添加多个标记ID,并获取至少包含其中一个标记的帖子列表。

我试过这个:

 SElECT t1.name 
   FROM posts AS t1 INNER JOIN posts_tags AS t2 
     ON t1.id = t2.post_id 
  WHERE t2.tag_id IN(1,2)

但这没有结果。我不确定从哪里开始。有什么方法可以在一个查询中做到这一点 - 即没有先获取帖子,然后循环遍历它们以获取标签?

4 个答案:

答案 0 :(得分:2)

使用IN运算符:

SELECT post_id
FROM posts_tags
WHERE tag_id IN (1,2,3)

为避免获得post_id重复项,请使用DISTINCT

SELECT DISTINCT post_id
...

答案 1 :(得分:0)

SELECT 
   t1.post_id 
FROM 
   posts_tags as t1
INNER JOIN 
   posts AS t2 
ON 
   t1.post_id = t2.id    
WHERE 
   t2.tag_id IN(1,2)

通过加入帖子表,您现在可以访问所有帖子数据,我认为这是您正在寻找的。

答案 2 :(得分:0)

您还必须加入posts_tags表。

 SElECT t1.name FROM posts as t1 INNER JOIN posts_tags as t3 on t3.post_id = t1.id INNER JOIN tags AS t2 ON t2.id = t3.tag_id WHERE t2.id IN(1,2)

SQLFiddle在这里回答。

http://www.sqlfiddle.com/#!2/d785e/5

答案 3 :(得分:-1)

SELECT posts.name FROM posts LEFT JOIN post_tags ON posts.id = post_tags.post_id WHERE post_tags.tag_id = '1' OR post_tags.tag_id = '2'