2010-03-27 138 views
0

我想按特定值對行進行計數和分組。這似乎很簡單,但我似乎無法做到。mySQL選擇並按值分組

我有一個表,建立與此類似:

Table: Ratings 
id pID uID rating 
1 1 2  7 
2 1 7  7 
3 1 5  4 
4 1 1  1 

id是主鍵,PID和UID是外國鍵。評級包含1到10之間的值,並且僅在1和10之間。

我想運行一些統計信息並計算具有特定值的評分數。在上面的例子中,兩個都留下了等級爲7

所以我寫了下面的查詢:

SELECT COUNT(*) AS 'count' , 'rating' 
FROM 'ratings' 
WHERE pID= '1' 
GROUP BY `rating` 
ORDER BY `rating` 

其產生很好的結果爲:

​​

我想獲取mySQL查詢以包含1到10之間的值。

例如:

Desired Result 
count ratings 
1  1 
0  2 
0  3 
1  4 
0  5 
0  6 
2  7 
0  8 
0  9 
0  10 

不幸的是,我是比較新的SQL和我經歷過的一切讀書,我可以得到我的手了幾個小時,但我不能得到它工作。我一直在傾向於某種類型的JOIN。

如果任何人都可以指出我正確的方向,這將不勝感激。

謝謝。

回答

1

我想不出任何函數或方法,直接得到你需要的評分範圍。我能想到的唯一的事情就是有一個包含允許範圍評分的表格。

Table: AllowedRatings 
rating 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

然後用這個做一個子查詢與參數表:

SELECT (SELECT COUNT(*) 
      FROM ratings 
     WHERE ratings.rating = AllowedRatings.rating 
      AND pid = '1' 
     ) 
    , rating 
FROM AllowedRatings 
ORDER BY rating 

我知道這也可以通過一個連接完成,但這樣會比較複雜,我是一個誠實有點太累了,無法解決,或者正確設置了一個DB來測試它,但子查詢方法應該可以工作。

這種方法的好處是,你可以把在爲你的等級的詳細信息,如描述(例如:1 = 'Sucks', 3 = 'Meh', 5 = 'Ok', 7 = 'Worthwhile', 10 = 'Amazing!')或改變的範圍,而無需修改硬編碼值

+0

謝謝,這正是我在找什麼。正如我所說的,我對SQL相當陌生,並且在之前嘗試過時無法獲得子查詢的語法。 – Foo 2010-03-27 05:57:40

+0

可能是你的查詢對於用戶來說更簡單,但對於mysql來說要複雜得多。 「這種方法的優點是你可以爲你的評級提供更多的信息」這不是這種方法的優點。在mysql中使用連接也可以做到這一點。 – zerkms 2010-03-27 06:17:07

+0

@jerkms我並不意味着使用子查詢的好處,我的意思是讓第二個表存儲允許的評級級別的信息的好處。我可能應該說得更好一點。 – Tarka 2010-03-27 16:36:47

1

用1到10的數字創建常規或臨時表,然後左鍵與您的表加入。像:

SELECT COUNT(`rating`) AS `count` , `rating` 
FROM `numbers` 
LEFT JOIN `ratings` ON `numbers`.`n` = `ratings`.`rating` 
WHERE pID= '1' 
GROUP BY `numbers`.`n` 

PS:使用'而不是'

0
你在你的查詢號碼錯別字:ORDER BY在這裏是不明確的,因爲默認情況下GROUP BY已經對結果進行排序

PPS

你可以在php中簡單地做到這一點。

//do mysql query 
for ($i=0; $i<10; $i++) { 
    //$i + 1 is this rating 
    //check if this ratings count is in result array 
    //else use 0 as count 
    //echo count 
}