mysql:选择没有可传递子记录的记录

3zwtqj6y  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(273)

我将说明我的问题,因为我知道这是非常混乱的。
假设您有三个表(数据不一致,仅用于说明目的):
类别

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

+----+-----------------------------+
| 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
fcwjkofz

fcwjkofz1#

我们的想法是 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

相关问题