以下查询是否应该产生相同的结果? (MySQL的)

时间:2010-09-12 21:43:11

标签: mysql

假设以下 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 

2 个答案:

答案 0 :(得分:3)

INNER JOIN查询中,表达式(gameslists.id is NULL)永远不会成立(假设id是主键)。这就是第一个结果集不包含任何行的原因。

另一方面,只要LEFT JOINON子句不匹配,gameslists字段对于该特定行将为NULL。因此,除非gamesgameslists,否则您的第二个查询将返回memberid中未显示的所有351

答案 1 :(得分:2)

INNER JOIN返回非NULL匹配,而LEFT JOIN一方可以为NULL。我认为这是线索。