MySQL左连接不包括不匹配的记录?

时间:2015-04-29 13:31:56

标签: mysql left-join

当我执行这个MySQL查询时,我得到了正确的结果:

select h.ID AS ProductID, h.ProductTitle, u.Username, ht.ProductType, hd.Difficulty-- , ifnull(sum(pv.UpVote),0) - ifnull(sum(pv.DownVote),0) AS NetVotes
from Products h 
join Users u on h.UserID = u.ID 
join ProductTypes ht on h.ProductTypeID = ht.ID 
join ProductDifficulties hd 
on h.ProductDifficultyID = hd.ID 
-- left join ProductVotes pv
-- on h.ID = pv.ProductID

注意我注释掉了select(聚合)和左连接中的最后一列。但是当我在sql中包含所有内容时,只包含具有匹配的ProductVotes记录的记录:

select h.ID AS ProductID, h.ProductTitle, u.Username, ht.ProductType, hd.Difficulty, ifnull(sum(pv.UpVote),0) - ifnull(sum(pv.DownVote),0) AS NetVotes
from Products h 
join Users u on h.UserID = u.ID 
join ProductTypes ht on h.ProductTypeID = ht.ID 
join ProductDifficulties hd 
on h.ProductDifficultyID = hd.ID 
left join ProductVotes pv
on h.ID = pv.ProductID

我希望这种行为来自内部联接,但不是左联接。为什么左连接不包括没有匹配的ProductVotes记录的记录?我怎样才能包含这些内容,就像上面的第一个查询一样?

编辑:最初我在查询结束时遇到LIMIT 0, 10,有些人认为这导致了问题。我删除了限制条款,问题仍然存在,因此与此无关。现在我已经删除了原始帖子中的LIMIT条款,因为它与此无关。还在等待答案。 : - )

以下是select * from ProductVotes的完整结果:

ID ProductID UserID UpVote DownVote
 2         1      2      1 NULL
 3         1      3      1 NULL
 4         1      4      1 NULL
 5         1      5      1 NULL
 6         1      6      1 NULL
 7         1      7      1 NULL
 8         1      8      1 NULL
 9         1      9   NULL    1
10         1     10   NULL    1
22         1      1      1 NULL

(注意表中只有10条记录。)

重要提示:请注意我的选择语句中的汇总:ifnull(sum(pv.UpVote),0) - ifnull(sum(pv.DownVote),0) AS NetVotes

2 个答案:

答案 0 :(得分:2)

select h.ID AS ProductID, h.ProductTitle, u.Username, ht.ProductType, hd.Difficulty, 
(select ifnull(sum(pv.UpVote),0) - ifnull(sum(pv.DownVote),0) from ProductVotes pv where h.ID = pv.ProductID ) AS NetVotes
from Products h 
join Users u on h.UserID = u.ID 
join ProductTypes ht on h.ProductTypeID = ht.ID 
join ProductDifficulties hd 
on h.ProductDifficultyID = hd.ID

答案 1 :(得分:0)

您的问题不是LIMIT 0,10 LIMIT

因此,要解决此问题,您可以从查询中删除LEFT JOIN

或者您可以尝试按照SELECT h.ID AS ProductID, h.ProductTitle, u.Username, ht.ProductType, hd.Difficulty, hv.NetVotes FROM Products h LEFT JOIN Users u ON h.UserID = u.ID LEFT JOIN ProductTypes ht ON h.ProductTypeID = ht.ID LEFT JOIN ProductDifficulties hd ON h.ProductDifficultyID = hd.ID LEFT JOIN ( SELECT ProductID, SUM(IFNULL(UpVote,0) - IFNULL(hv.DownVote,0)) AS NetVotes FROM ProductVotes GROUP BY ProductID ) hv ON h.ID = hv.ProductID LIMIT 0, 10; 编辑记录放在底部的方式更改顺序,如:

GWT.create