我想按特定值对行进行计数和分组。这似乎相当简单,但我似乎无法做到。
我有一个类似于此的表格设置:
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。
如果有人能指出我正确的方向,我们将不胜感激。
感谢。
答案 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
}