我会很困惑地说明我的问题。
假设您有三个表(数据不一致,仅用于说明目的:]
类别
+----+----------+
| 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
想法是使用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