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

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

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

  1. +----+----------+
  2. | id | name |
  3. +----+----------+
  4. | 1 | History |
  5. | 2 | Sci-fi |
  6. | 3 | Mystery |
  7. +----+----------+

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

标签

  1. +----+---------+-------------+
  2. | id | book_id | name |
  3. +----+---------+-------------+
  4. | 1 | 452 | Bestseller |
  5. | 2 | 42 | Novel |
  6. | 3 | 921 | Novelty |
  7. +----+---------+-------------+

我需要为每本书选择所有未分配的标签。
下面的查询只是显示每个类别、每本书的所有标记,我需要(在这里重复我自己)只选择那些分配给任何其他书而不是当前书的标记。
或者换言之,只选择尚未分配给书本的标记。

  1. SELECT c.id category_id, b.name, t.book_id, t.id tag_id
  2. FROM tags t
  3. LEFT JOIN book b ON b.id=t.book_id
  4. LEFT JOIN category c ON c.id=b.category_id
fcwjkofz

fcwjkofz1#

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

  1. select b.*, t.name
  2. from (select distinct name from tags) t cross join
  3. books b left join
  4. tags tt
  5. on tt.book_id = b.id and tt.name = t.name
  6. where tt.book_id is null

相关问题