3

我有一个带有操作和 question_ids 的 mysql 表。每个动作都有这样的分数:

     ACTION       | SCORE
downvote_question |  -1
upvote_question   |  +1
in_cardbox        |  +2

我想查询得分最高的问题,但我无法弄清楚。

http://sqlfiddle.com/#!2/84e26/15

到目前为止,我的查询是:

SELECT count(*), l1.question_id, l1.action 
FROM `log` l1
GROUP BY l1.question_id, l1.action

这给了我每个 question_id 及其所有累积操作。

我想要的是这样的:

QUESTION_ID | SCORE
     2      |   5
     1      |   4
     3      |   1
     4      |   1
     5      |   1

我想不通 - 我可能需要子查询、JOINS 或 UNIONS ......

4

3 回答 3

2

也许你可以试试这个。

SELECT  a.question_id, sum(b.score) totalScore
FROM   `log` a INNER JOIN scoreValue b
          on a.`action` = b.actionname
group by a.question_id
ORDER BY totalScore DESC

SQLFiddle 演示

于 2012-08-14T12:19:16.413 回答
1

您应该将 count(*) 替换为 sum(l1.score) 因为 sum 将根据 group by 语句添加所有值

SELECT sum(l1.score), l1.question_id, l1.action 
FROM `log` l1
GROUP BY l1.question_id, l1.action

在 SQL Fiddle 上使用恒定分数(按问题分组):

SELECT 
sum(
  CASE WHEN l1.action = 'downvote_question' THEN -1 
  WHEN l1.action = 'upvote_question' THEN 1 
  ELSE 2 END
) score,
l1.question_id
FROM `log` l1
GROUP BY l1.question_id
于 2012-08-14T12:13:32.290 回答
0
SELECT sum(SCORE), l1.question_id, l1.action 
FROM `log` l1
GROUP BY l1.question_id, l1.action

这是你想要的吗?

upd:在您的 fidel 代码中,没有诸如 score 之类的列,但我认为创建带有操作的表不会有问题 | 得分并将其加入总和(得分)

于 2012-08-14T12:12:50.903 回答