左联接为NULL,但不等于两者都显示意外结果

时间:2018-12-15 04:57:13

标签: mysql sql left-join

震惊!以下代码有什么问题? LEFT JOINNULL都没有选择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 JOINNull一起使用

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

但它什么也不返回

SQL Fiddle

2 个答案:

答案 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
                 );