СЛЕДУЮЩИЙ С NULL, НЕ РАВНО оба они показывают неожиданный результат - PullRequest
0 голосов
/ 15 декабря 2018

Будьте в шоке!Что не так со следующим кодом?Ни 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

, но он ничего не возвращает

SQLFiddle

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Теперь необходимо показать остальные книги, которые не относятся к блокам.

Самый прямой путь к этому - использовать NOT EXISTS:

select b.*
from book b
where not exists (select 1
                  from block_book bb
                  where bb.book = b.id
                 );
0 голосов
/ 15 декабря 2018

Вы должны использовать 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
...