震惊!以下代码有什么问题? LEFT JOIN
和NULL
都没有选择Null
行,MYSQL !=
运算符也没有显示仅不匹配的行
两张桌子
表book
-书籍列表
id | ttl
===========
1 | Science
2 | Math
3 | English
表block_book
-分配给每个区块的图书清单
id | block| book
=====================
1 | 1 | 1
2 | 1 | 2
现在,要求是显示未分配给块的其余书籍。那我怎么办
SELECT
book.id AS id, book.ttl AS book
FROM
block_book
JOIN
book ON book.id != block_book.book
GROUP BY book.id
使用!=
运算符,它应该跟随结果,不是吗?因为只有主题English
不在表block_book
预期结果
id | book
===========
3 | English
但是所有书籍都被选中。 当前结果
id | book
===========
1 | Science
2 | Math
3 | English
我尝试将Left JOIN
与Null
一起使用
SELECT
book.id AS id, book.ttl AS book
FROM
block_book
LEFT JOIN
book ON book.id = block_book.book
WHERE block_book.book IS NULL
但它什么也不返回
答案 0 :(得分:2)
您应该使用right join
。
所以这应该起作用:
SELECT
book.id AS id, book.ttl AS book
FROM
block_book
RIGHT JOIN
book ON book.id = block_book.book
WHERE block_book.book IS NULL
或者,如果您想使用left join
,则应这样编写查询:
SELECT
book.id AS id, book.ttl AS book
FROM
book
LEFT JOIN
block_book ON book.id = block_book.book
WHERE block_book.book IS NULL
答案 1 :(得分:1)
现在,要求是显示未分配给块的其余书籍。
解决此问题的最直接方法是使用NOT EXISTS
:
select b.*
from book b
where not exists (select 1
from block_book bb
where bb.book = b.id
);