2016-08-17 69 views
0

我正在做一個食物評論的網頁,有一個名爲top 10的頁面,根據食物評論它將顯示前10名。我目前有這個SQL,但它結合了所有的菜餚評分和組合爲一盤。這條SQL語句被放置在PHP代碼中。SQL語句沒有正確分組

SELECT i.path, i.name, AVG(r.review_rating), r.image_id 
    FROM images i, review r 
WHERE r.image_id = i.id 
GROUP BY 'r.image_id' 
ORDER BY AVG(r.review_rating) DESC 
LIMIT 10 
+0

歡迎來到Stack Overflow。請儘快閱讀[關於]頁面和[詢問]頁面。 「不工作」並不能很好地表徵問題。使用SQL,我們確實需要查看查詢中每個表的大綱模式,以及一些(2-5?)行數據,並描述了您所看到的以及您想查看的內容。簡單地給出表名,列名和樣本值而沒有正式模式就足夠了。 –

+0

GROUP BY子句中'r.image_id'附近的引號是什麼?它們似乎是單引號,所以您按照常量字符串進行分組,這可能意味着您只能獲得一個組,因爲組「列」(值)只有一個值。如果你正在使用MySQL(這是一個好主意,以確定你正在使用SQL問題的數據庫管理系統),你可能打算使用''GROUP BY'r'.'image_id''雖然坦率地說我會使用'GROUP BY r.image_id'。 –

+0

而老式的'FROM table1,table2'表示法被SQL-92過時了。你不應該在20年後寫成的SQL中使用它。 –

回答

1

沒有看到你的sql模式,很難確切地知道你需要改變它到什麼。但它看起來像你可能想要使用JOIN而不是從多個表中選擇。試一下這個:(10個或更多的獨特r.image_id的,您可以通過刪除GROUP BY,看着檢查的結果,這一點)

SELECT i.path, 
    i.name, 
    AVG(r.review_rating), 
    r.image_id 
FROM images i 
JOIN review r ON r.image_id = i.id 
GROUP BY r.image_id 
ORDER BY AVG(r.review_rating) DESC 
LIMIT 10 

你還需要檢查是否有實際10倍不同的圖像。

如果這不起作用,然後張貼您的架構。

+0

我相信如果少於10個,它會顯示有多少個對嗎? – user3567749

+0

@ user3567749:如果少於10行,它將顯示所有可用的行。 –

1

問題出在GROUP BY 'r.image_id'
'r.image_id'是一個字符串,這使得GROUP BYWHERE子句過濾的所有行中創建一個組。您可能想要GROUP BY r.image_id

瞭解更多關於何時在MySQL中使用apostrophes, quotes and backticks的信息。