2011-08-19 51 views
1

我有這樣一個查詢:Mysql的SUM輸出是錯誤的

SELECT DISTINCT 
g.thumb, h.hotel_name, h.id, COUNT(c.id) as total_comments, SUM(c.rating) AS total_ratings 
FROM 
at_hotels h 
LEFT JOIN 
at_gallery g 
ON 
h.id = g.h_id 
LEFT OUTER JOIN 
at_comments c 
ON 
h.id = c.h_id AND c.status = '1' 
GROUP BY h.id 
ORDER BY h.id DESC LIMIT 5 

查詢工作,除了SUM(等級)。總和命令給予超過預期。我也試過這樣的SUM命令:

--query 
(SELECT SUM(rating) FROM at_comments WHERE at_comments.h_id = at_hotels.id) AS total 
--more query 

並且這不起作用。

總的必須是:13,但這是給36.問題在哪裏?

樣本數據:(評論表)

id h_id rating 
---------- 
1 | 1 |5 
---------- 
2 | 1 |3 
---------- 
3 | 1 |5 

我的表:

Tables

+2

運行不帶'GROUP BY'的查詢來查看是否由於您的連接而發生意外的記錄重複。 –

+0

還有一件事,我刪除截然不同,但沒有改變。仍是同樣的問題。 –

+0

@ a'r也嘗試過,但沒有發生。 –

回答

0

我解決了這個問題。

問題是「評級」行數據類型。

評級行數據類型爲'SET',值爲1,2,3,4,5。

我改變了數據類型爲TINYINT,記錄被自動改變這樣的:

5 -> 16 
3 -> 4 
5 -> 16 

16 + 4 + 16 = 36 

所以,總結「SET」數據類型是越野車的東西?

0

這完全取決於你的數據(我們看不到),但我建議不要依賴在MySQL上爲你的分組做「正確的事情」,但要明確GROUP BY他們:

SELECT 
MAX(g.thumb), h.hotel_name, h.id, COUNT(c.id) as total_comments, SUM(c.rating) AS total_ratings 
FROM 
at_hotels h 
LEFT JOIN 
at_gallery g 
ON 
h.id = g.h_id 
LEFT OUTER JOIN 
at_comments c 
ON 
h.id = c.h_id AND c.status = '1' 
GROUP BY h.id, h.hotel_name 
ORDER BY h.id DESC LIMIT 5 
+0

我上傳了一張圖片,以便您可以看到數據。 –

0

首先,丟失DISTINCT - 這是不需要的。
其次,格式化您的查詢,以便它是可讀的,像這樣的格式:

SELECT 
    g.thumb, 
    h.hotel_name, 
    h.id, 
    COUNT(c.id) as total_comments, 
    SUM(c.rating) AS total_ratings 
FROM at_hotels h 
LEFT JOIN at_gallery g ON h.id = g.h_id -- put join, tablee and on clause on same line 
LEFT JOIN at_comments c ON h.id = c.h_id AND c.status = '1' -- removed OUTER: redundant 
GROUP BY 1,2,3 
ORDER BY h.id DESC 
LIMIT 5; 

第三(前面已經完成的),在非集合列添加到GROUP BY - 我更喜歡用數字 - 它更清晰。

看看是怎麼回事。

+0

對不起,但無法正常工作。仍然給錯誤的結果。 –