sql – 如何列出不存在的项目?

前端之家收集整理的这篇文章主要介绍了sql – 如何列出不存在的项目?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

标题可能有点令人困惑,让我解释一下,;)
我有3张桌子:

  1. [names]
  2. n_id;name
  3. 1;Jeff
  4. 2;Adam
  5. [books]
  6. b_id;title
  7. 1;Book1
  8. 2;Book2
  9. [read]
  10. n_id;b_id

表[read]是一本包含阅读书籍的表格.
如果Adam读“Book1”,[read]中的项目如下所示:

  1. 2;1

到现在为止还挺好.
现在,有没有办法知道一个人没有读过哪些书?
我们知道只有亚当读了一本书“Book1”,所以查询输出如下内容

  1. n_id;name;b_id;title
  2. 1;Jeff;1;Book1
  3. 1;Jeff;2;Book2
  4. 2;Adam;2;Book2

是可以在1个查询中执行此操作还是需要一些脚本?

最佳答案
您可以使用CROSS JOIN获取名称和书籍的所有可能组合,然后使用带有IS NULL的LEFT JOIN读取删除存在的行.

对于没有行存在的所有连接列,LEFT JOIN返回NULL,因此检查r.n_id IS NULL是否删除了连接实际在read中找到行的那些行.

  1. SELECT n.n_id,n.name,b.b_id,b.title
  2. FROM names n
  3. CROSS JOIN books b
  4. LEFT JOIN read r ON ( r.n_id = n.n_id AND r.b_id = b.b_id )
  5. WHERE r.n_id IS NULL

猜你在找的MySQL相关文章