当我执行这个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
答案 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