我将说明我的问题,因为我知道这是非常混乱的。
假设您有三个表(数据不一致,仅用于说明目的):
类别
+----+----------+
| 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
1条答案
按热度按时间fcwjkofz1#
我们的想法是
cross join
生成书籍和标签的所有组合。然后使用left join
或者其他一些方法来过滤掉已经存在的: