我想加入 10 个以上的表,然后从特定表中获取
id
列。
场景有点复杂,我们这里简化一下。
假设我们有三张桌子,
posts
、users
和tags
。喜欢这些:
+-------------------+
| posts |
+----------+--------+
| posts_id | title |
+----------+--------+
| 1 | post_1 |
| 2 | post_2 |
+----------+--------+
+------------------+
| users |
+----------+-------+
| users_id | email |
+----------+-------+
| 1 | [email protected] |
| 2 | [email protected] |
+----------+-------+
+-----------------+
| tags |
+---------+-------+
| tags_id | label |
+---------+-------+
| 1 | tag_1 |
| 2 | tag_2 |
| 3 | tag_3 |
| 4 | tag_4 |
+---------+-------+
每个
posts
有很多tags
:
+------------------------+
| posts_tags |
+----+---------+---------+
| id | post_id | tags_id |
+----+---------+---------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
| 4 | 2 | 2 |
| 5 | 2 | 3 |
+----+---------+---------+
此外,每个
users
也订阅了许多tags
:
+------------------------+
| users_tags |
+----+---------+---------+
| id | user_id | tags_id |
+----+---------+---------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 4 | 2 | 2 |
| 5 | 2 | 3 |
| 6 | 2 | 4 |
+----+---------+---------+
我想找到所有标签都被用户订阅的所有帖子。
在上面的示例中,
post_2
有2个标签:tag_2
和tag_3
。
另外,user_2
订阅了3个标签:tag_2
、tag_3
和tag_4
所有
posts_2
标签都是 user_2
标签的子集,所以我想选择 posts_2
的 posts_id
列
但是 posts_
有一个 user_2
没有订阅的标签 (tag_1
),所以我不想选择这一行。
这是我编写的示例代码,但不完整:
SELECT `posts_id` FROM `posts`
INNER JOIN `posts_tags` USING (`posts_id`)
INNER JOIN `users_tags` USING (`tag_id`)
***** SOME MAGIC HERE *****
WHERE `users_tags`.`user_id` = 2
SQL 代码应该适用于
sqlite
和 mysql
/mariadb
。
根据您帖子中的描述,我认为您仍在正轨上。您只需要在用户表上进行内部联接。如果您还想从标签表中获取信息,您可能还需要加入标签表,如下所示,以获取用户订阅其标签的所有帖子。
SELECT posts.id, tags.id, users.id
FROM posts
INNER JOIN posts_tags ON posts_tags.post_id = posts.id
INNER JOIN users_tags ON users_tags.tags_id = posts_tags.tags_id
INNER JOIN tags ON users_tags.tags_id = tags.id
INNER users ON users_tags.user_id = users.id