2012-02-27 23 views
1

我想要發生的事情是先由parentid分組,然後按位置分組,這是我做的。在該組中,我希望顯示最高評分的名稱,但這並未發生。而是顯示每個組的最低ID。結果應該是tv1,tv3,tv5,tv7;因爲這些是每組最高的評估值。Mysql查詢最大不能正常工作

id | name| parentid| position| rating | 
    1 | tv1 | 1 | 1  | 6 | 
    2 | tv2 | 1 | 2  | 5 | 
    3 | tv3 | 1 | 2  | 7 | 
    4 | tv4 | 1 | 2  | 3 | 
    5 | tv5 | 5 | 1  | 8 | 
    6 | tv6 | 5 | 1  | 2 | 
    7 | tv7 | 3 | 1  | 9 | 
    8 | tv8 | 3 | 1  | 3 | 



    $getquery = mysql_query("SELECT name,MAX(rating) FROM outcomes GROUP BY position,parentid") or die(mysql_error()); 

while($row=mysql_fetch_assoc($getquery)) { 

$name = $row['name']; 
$rating = $row['rating']; 

echo "<p>Name: $name - $rating</p><p></p>"; 

} 

回答

4

這並不是說最低的ID正在顯示 - 你實際上並沒有選擇id列。可能您看到的是每個組的name列中的第一個條目。

SELECT name, MAX(rating) 

不會做你認爲它 - 它不指示MySQL挑在評級列中的最大值,並返回與該行(除關聯的名稱:做什麼你認爲它會返回,如果有一個最大額定值的平行?如果你使用AVERAGE而不是MAX,你認爲它會返回嗎?)

它是什麼,而不是返回正確計算的最大(評級),和然後是該組中的其中一個名字。它不保證哪一個被返回,並且可以根據它決定執行查詢的方式進行更改。

事實上,由於這樣的查詢的未定義性質,它甚至不在其他數據庫中的合法SQL。 (在Postgres中試試這個,你會得到一個錯誤,呃,在MySQL中啓用ONLY_FULL_GROUP_BY選項,你會得到一個類似的錯誤)

如果你想要做的是找到最大額定值對於每一個組,然後找到與之相關的名字,你就必須做這樣的事情:

SELECT name, max_rating FROM outcomes 
JOIN (SELECT position, parentid, MAX(rating) AS max_rating from outcomes group by position, parentid) AS aggregated_table 
USING (position, parentid) 
WHERE rating = max_rating 

(有四層五個其他的方法可以做到這一點,MySQL和聚合搜索這個網站將可能會把他們)

+0

謝謝,你會如何建議我解決這個問題? – user892134 2012-02-27 18:15:00

+0

我已經更新了答案,添加了一個適用於您的查詢 – 2012-02-27 18:21:26

+0

感謝它的運作。如果他們的重複最高收視率爲一組?我將如何只有一行返回,而不是所有的重複? – user892134 2012-02-27 18:26:25