假设以下 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
答案 0 :(得分:3)
在INNER JOIN
查询中,表达式(gameslists.id is NULL)
永远不会成立(假设id
是主键)。这就是第一个结果集不包含任何行的原因。
另一方面,只要LEFT JOIN
的ON
子句不匹配,gameslists
字段对于该特定行将为NULL
。因此,除非games
为gameslists
,否则您的第二个查询将返回memberid
中未显示的所有351
。
答案 1 :(得分:2)
INNER JOIN
返回非NULL匹配,而LEFT JOIN
一方可以为NULL。我认为这是线索。