2014-02-28 97 views
0

我有一個查詢時遇到的問題,MySQL的左連接用SUM和Where子句返回NULL

SELECT id, name, cc, total FROM goods gd 
LEFT JOIN (SELECT count(*) as cc, status, pid, SUM(number) as total FROM prices)pr 
ON pr.pid = gd.id AND pr.status = 0 WHERE gd.id=20 

當我如果取正確的,但我的遠程服務器上運行的本地服務器上此查詢CC和總量返回null。

請問原因? 注意:如果我刪除了count(*)和SUM(number)它返回多行,我想讓左連接在第二個表中獲得總匹配和數字總和。

回答

1

這裏是你的查詢:

SELECT id, name, cc, total 
FROM goods gd LEFT JOIN 
    (SELECT count(*) as cc, status, pid, SUM(number) as total 
     FROM prices 
    ) pr 
    ON pr.pid = gd.id AND pr.status = 0 
WHERE gd.id=20; 

子查詢使用的是MySQL(MIS)的功能,可以讓你有在select列,如pid不在的group by並不在彙總列中。 MySQL documentation非常明確,這些列的值來自任意匹配記錄,並且只有當列中的所有值在組中相同時才應使用此功能。

發生了什麼事情是,您的服務器上的任意列確實是而不是的值是20.巧合的是,在您的本地服務器上,確實如此。

您也有一個status問題,所以邏輯也不應該是穩定的。

你想要的總和在哪裏status = 0,這樣?

SELECT gd.id, gd.name, pr.cc, pr.total 
FROM goods gd LEFT JOIN 
    (SELECT count(*) as cc, status, pid, SUM(number) as total 
     FROM prices 
     WHERE status = 0 
     GROUP BY pid 
    ) pr 
    ON pr.pid = gd.id 
WHERE gd.id = 20; 

或者,你想只匹配記錄,其中status總是等於0

SELECT gd.id, gd.name, pr.cc, pr.total 
FROM goods gd LEFT JOIN 
    (SELECT count(*) as cc, status, pid, SUM(number) as total 
     FROM prices 
     GROUP BY pid 
     HAVING min(status) = 0 and max(status) = 0 
    ) pr 
    ON pr.pid = gd.id 
WHERE gd.id = 20; 
+0

謝謝@ Gordon-Linoff的綜合答案,會選擇你的答案,但echo_Me的答案首先出現。再次感謝。 – andychukse

+0

@andychukse。 。 。作者有權選擇他們認爲最好的答案。你的問題是:「請問原因?」,這不是「我該如何解決這個問題」。另外,echo_me的回答並不處理'status'的問題,你會發現這是一個揮之不去的問題。 –

+0

我剛剛注意到你指出的狀態問題,我會更新你的答案。太感謝了 – andychukse

0

您必須在已加入的查詢中添加group by pid

SELECT id, name, cc, total FROM goods gd 
LEFT JOIN (SELECT count(*) as cc, status, pid, SUM(number) as total 
      FROM prices group by pid)pr 
ON pr.pid = gd.id AND pr.status = 0 
WHERE gd.id=20 
+0

感謝加入GROUP BY pid解決了這個問題。 – andychukse

+0

你歡迎:)我想知道你去了哪裏:)。 –

+0

對不起,我仍然有總和(數字)的問題,只有當狀態= 0 @下面的Glordon-Linoff答案解決了這個問題。謝謝 – andychukse