如何在INNER JOIN中使用IN()子句?

时间:2018-06-17 13:02:42

标签: mysql sql

这是我的问题:

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 = "mysql"

我要做的就是获取标有特定标签的帖子。在上面的查询中,我选择了mysql标记的所有帖子。

现在我需要让它适用于多个标签。我的意思是,我想选择所有标有mysqlphp的帖子。我想我必须在查询中使用IN()子句。但我不知道究竟是怎么回事。有什么想法吗?

EX:以下是我的表格:

// posts
+----+---------+------------+
| id | subject |    body    |
+----+---------+------------+
| 1  | sub1    | content1   |
| 2  | sub2    | content2   |
+----+---------+------------+

// tags
+----+--------+
| id |  name  |
+----+--------+
| 1  | mysql  |
| 2  | php    |
+----+--------+

// pivot 
+---------+--------+
| post_id | tag_id |
+---------+--------+
| 1       | 1      |
| 2       | 1      |
| 2       | 2      |
+---------+--------+

[mysql]的预期结果:

| 1  | sub1    | content1   |
| 2  | sub2    | content2   |

[mysql][php]的预期结果:

| 2  | sub2    | content2   |

3 个答案:

答案 0 :(得分:2)

我会为条件使用WHERE子句,然后聚合:

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 
WHERE t.name IN ('mysql', 'php')
GROUP BY p.id
HAVING COUNT(*) = 2;  -- this is the number of tags in the list

这假设标签不重复。

关于将GROUP BY p.idSELECT p.*一起使用的说明。这实际上是有效的,并且ANSI标准允许,假设p.idposts中是唯一的。具体规则基于功能依赖。

我认为最新版本的MySQL默认情况下不允许使用该构造。您可以随时执行以下操作:

SELECT p.*
FROM posts p JOIN
     (SELECT pi.post_id
      FROM pivot pi INNER JOIN
           tags t 
           ON t.id = pi.tag_id 
      WHERE t.name IN ('mysql', 'php')
      GROUP BY p.id
      HAVING COUNT(*) = 2  -- this is the number of tags in the list
     ) t
     ON p.id = t.post_id ;

答案 1 :(得分:1)

我不知道为什么我们应该把它复杂化。

in子句的Instade只是使用字符串输入来查询并将其与字符串聚合进行比较。

-40

答案 2 :(得分:1)

  

我想选择所有用mysql和php标记的帖子。我想我必须在查询中使用IN()子句。

不。这将显示标记为一个或另一个的帖子。要查找两者的帖子,我会加入表格两次:

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"

...