2010-09-12 95 views
0

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

这会产生空

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 

回答

3

表达(gameslists.id is NULL)永远不能在INNER JOIN查询真(假设id是主键)。这就是为什么第一个结果集不包含行。

另一方面,只要LEFT JOINON子句不匹配,那么该特定行的gameslists字段将为NULL。因此,如果memberid351,则第二个查询将返回所有未出现在gameslists中的games

+0

谢谢Daniel! – Mohamad 2010-09-12 22:00:19

+0

@梅尔:什么是产生错误? – 2010-09-12 22:00:56

+0

不是,一个错误,但也为空:LEFT JOIN gameslists ON gameslists.gameid = games.id WHERE gameslists.id为NULL AND gameslists.memberid <> 352 – Mohamad 2010-09-12 22:02:00

2

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