复杂的MySQL查询?

时间:2010-05-22 22:15:57

标签: php mysql

我有两张表如下:

我有一个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)。我想对最高比例的负面评价做同样的事情,但我相信我可以相应调整一个正面。

2 个答案:

答案 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

摘要:将评分加入您的反馈表,但按用户名分组,这样您每个结果只能获得一个用户名。