JOIN,其中所有行都是另一个表的子集

问题描述 投票:0回答:1

我想加入 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

sql mysql sqlite mariadb relational-division
1个回答
0
投票

根据您帖子中的描述,我认为您仍在正轨上。您只需要在用户表上进行内部联接。如果您还想从标签表中获取信息,您可能还需要加入标签表,如下所示,以获取用户订阅其标签的所有帖子。

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
© www.soinside.com 2019 - 2024. All rights reserved.