MySQL:选择没有传递子记录的记录

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

我会很困惑地说明我的问题。

假设您有三个表(数据不一致,仅用于说明目的:]

类别

+----+----------+
| id | name     |
+----+----------+
| 1  | History  |
| 2  | Sci-fi   |
| 3  | Mystery  |
+----+----------+

Book

+----+-----------------------------+
| id | category_id | name          |
+----+-------------+---------------+
| 1  | 5           | Mowgli        |
| 2  | 7           | Don Quixote   |
| 3  | 11          | Ulysses       |
+----+-------------+---------------+

标签

+----+---------+-------------+
| id | book_id | name        |
+----+---------+-------------+
| 1  | 452     | Bestseller  |
| 2  | 42      | Novel       |
| 3  | 921     | Novelty     |
+----+---------+-------------+

我需要为每本书选择所有未分配的标签。

下面是只显示每本书每个类别的所有标签的查询,在这里我需要(我在这里重复一下)仅选择分配给任何其他书的那些标签,而不是当前的标签。

或换句话说,仅选择尚未分配给该书的标签。

SELECT c.id category_id, b.name, t.book_id, t.id tag_id 
FROM tags t
LEFT JOIN book b ON b.id=t.book_id
LEFT JOIN category c ON c.id=b.category_id 
mysql sql select filter left-join
2个回答
1
投票

想法是使用cross join生成书籍和标签的所有组合。然后使用left join或其他方法过滤掉已经存在的那些:

select b.*, t.name
from (select distinct name from tags) t cross join
     books b left join
     tags tt
     on tt.book_id = b.id and tt.name = t.name
where tt.book_id is null
© www.soinside.com 2019 - 2024. All rights reserved.