我有两张表如下:
我有一个RatingsTable,其中包含一个评级名称和一个位,无论是正面还是负面评级:
RatingsTable ---------------------- ratingname ispositive ---------------------- Good 1 Bad 0 Fun 1 Boring 0
我有一个FeedbackTable,其中包含对事物的反馈:人员评级,评级和评级。如果反馈是基于RatingsTable的正面或负面评级,则可以确定反馈。
FeedbackTable --------------------------------- username thing ratingname --------------------------------- Jim Chicken Good Jim Steak Bad Ted Waterskiing Fun Ted Hiking Fun Nancy Hiking Boring
我正在尝试为以下内容编写有效的MySQL查询:
在某个页面上,我想显示积极评分比例最高的顶级“事物”。我想确保反馈表中的项目是独一无二的......这意味着,如果Jim已将Chicken Good评为20次......它应该只计算一次。在某些时候,我还想要为此页面计算最小数量的评级(至少10)。我想对最高比例的负面评价做同样的事情,但我相信我可以相应调整一个正面。
答案 0 :(得分:7)
要按好评分的比例排列“事物”,您可以使用此查询:
SELECT thing, SUM(ispositive) / COUNT(*) AS proportion_positive
FROM (SELECT DISTINCT username, thing, ratingname FROM FeedbackTable) T1
JOIN RatingsTable T2
ON T1.ratingname = T2.ratingname
GROUP BY thing
ORDER BY proportion_positive DESC
对于您的示例数据,它会返回:
thing proportion_positive Chicken 1.0000 Waterskiing 1.0000 Hiking 0.5000 Steak 0.0000
要在结果中显示内容之前要求至少10票,请在GROUP BY
之后添加此行:
HAVING COUNT(*) >= 10
要获得负面评分的比例从SUM(ispositive)
更改为SUM(NOT ispositive)
。
注意:向您的投票表添加唯一约束可能更好,而不是仅选择分辨率值。
答案 1 :(得分:1)
SELECT *
FROM `feedback`
LEFT JOIN `ratings` ON `feedback`.`rating` = `rating`.`label`
ORDER BY `rating`.`value` DESC
GROUP BY `feedback`.`username`
LIMIT 10
摘要:将评分加入您的反馈表,但按用户名分组,这样您每个结果只能获得一个用户名。