Предполагая следующую структуру MySQL, почему два следующих запроса дают разные результаты?
games(id) (464 records)
members(id) (1 record, id=351)
gameslists(id,memberid,gameid) -- (2 records, (1,351,1) and (2,351,2))
В результате получается null
SELECT games.*
FROM games
INNER JOIN gameslists ON gameslists.gameid = games.id
WHERE gameslists.memberid <> 351 AND gameslists.id is NULL
Это дает 462 записи, которые я ожидаю.
SELECT games.*
FROM games
LEFT JOIN gameslists ON gameslists.gameid = games.id AND gameslists.memberid <> 351
WHERE gameslists.id is NULL
Выражение (gameslists.id is NULL)
никогда не может быть истинным в INNER JOIN
query (предполагая, что id
является первичным ключом). Поэтому первый набор результатов не содержит строк.
С другой стороны, всякий раз, когда предложение ON
LEFT JOIN
не соответствует, поля gameslists
будут NULL
для этой конкретной строки. Поэтому ваш второй запрос вернет все games
, которые не отображаются в gameslists
, если только memberid
не является 351
.
INNER JOIN
возвращает не NULL-совпадения, тогда как LEFT JOIN
может быть NULL с одной стороны. Я думаю, что это ключ.