这是我的问题:
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
标记的所有帖子。
现在我需要让它适用于多个标签。我的意思是,我想选择所有标有mysql
和php
的帖子。我想我必须在查询中使用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 |
答案 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.id
与SELECT p.*
一起使用的说明。这实际上是有效的,并且ANSI标准允许,假设p.id
在posts
中是唯一的。具体规则基于功能依赖。
我认为最新版本的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"
...