MySQL查询 - 根据列获取计数总和

3

我有一个包含操作和问题ID的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

我无法理解它 - 我可能需要子查询,连接或合并...

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 Demo


这已经很不错了,只是分数来自于 PHP 常量而不是另一个表格。不过调整起来应该很容易。我会试一试。 - Horen
你可以为你的常量创建表格 :) - John Woo
我可以这样做 - 但这意味着每当分数发生变化时,我都必须在两个地方进行调整 - 所以我更喜欢将它们存储在一个地方。 - Horen
最好将它们存储在数据库中,每次加载时只需从 PHP 中获取它们。因为将其存储在 PHP 文件中的未来并不是一个好主意。 - pomaxa
@Horen 如果常量在你的PHP文件中,你会有更多的工作要做。但这仍然取决于你 :) - John Woo

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

没有名为“score”的列。 - Horen
但是分数基于哪些标准来评定行动价值? - Luke Adamczewski
是的。分数来自于 PHP 常量。因此它们必须已经在查询中了。 - Horen
现在尝试一下,它不需要按操作分组,而只需要按问题总分计算。因为所有值都等于2,所以我忘记添加比较的情况。 - Luke Adamczewski

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

这是你想要的吗?

更新:在你的 Fidel 代码中,没有“score”列,但我认为创建一个带有动作 | 分数并将其连接到sum(分数)的表格不会成为问题。


分数来自 PHP 常量,必须添加到查询中。目前我们可以硬编码它。 - Horen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接