mySQL选择并按值分组

时间:2010-03-27 05:00:05

标签: sql 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`

产生了不错的结果:

count  ratings
1      1
1      4
2      7

我想让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。

如果有人能指出我正确的方向,我们将不胜感激。

感谢。

3 个答案:

答案 0 :(得分:1)

使用1到10之间的数字创建常规或临时表,并将LEFT JOIN加入您的表中。像:

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

ps:ORDER BY在这里是不明确的,因为默认情况下GROUP BY已经对结果进行了排序

pps:你的查询中有一些拼写错误,使用'而不是`

答案 1 :(得分: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

我知道这也可以通过连接来完成,但是这会更复杂,我老实说有点太累了,无法正确设置数据库来测试它,但子查询方法应该工作

此方法的优点是您可以为评分添加更多信息,例如说明(例如:1 = 'Sucks', 3 = 'Meh', 5 = 'Ok', 7 = 'Worthwhile', 10 = 'Amazing!')或更改范围而无需编辑硬编码值

答案 2 :(得分:0)

你可以在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
}