标题可能有点令人困惑,让我解释一下,;)
我有3张桌子:@H_404_3@
@H_404_3@
[names]
n_id;name
1;Jeff
2;Adam
[books]
b_id;title
1;Book1
2;Book2
[read]
n_id;b_id
表[read]是一本包含阅读书籍的表格.
如果Adam读“Book1”,[read]中的项目如下所示:@H_404_3@
@H_404_3@
2;1
到现在为止还挺好.
现在,有没有办法知道一个人没有读过哪些书?
我们知道只有亚当读了一本书“Book1”,所以查询应输出如下内容:@H_404_3@
@H_404_3@
n_id;name;b_id;title
1;Jeff;1;Book1
1;Jeff;2;Book2
2;Adam;2;Book2
是可以在1个查询中执行此操作还是需要一些脚本?
最佳答案
您可以使用
CROSS JOIN
获取名称和书籍的所有可能组合,然后使用带有IS NULL的LEFT JOIN
读取删除存在的行.@H_404_3@
对于没有行存在的所有连接列,LEFT JOIN返回NULL,因此检查r.n_id IS NULL是否删除了连接实际在read中找到行的那些行.@H_404_3@
@H_404_3@
SELECT n.n_id,n.name,b.b_id,b.title
FROM names n
CROSS JOIN books b
LEFT JOIN read r ON ( r.n_id = n.n_id AND r.b_id = b.b_id )
WHERE r.n_id IS NULL