3

我有这个积分表:

============================================
领域:类型
============================================
id int(11)
user_id int(11)
值 int(11)
类型枚举('加','减')
时间戳 int(11)
============================================

基本上这个表存储用户点的记录。

现在我的问题是:如何获得总分最高的前 10 名用户?

注意:我被告知要更改我的架构——删除“类型”字段并为“值”字段输入正值和负值。我只想知道是否可以使用当前模式实现所需的查询。

提前致谢

4

1 回答 1

6

我会尝试这样的事情:

SELECT
  user_id,
  SUM( IF(`type`='add',+1,-1) * `value`) AS user_points
FROM Points
GROUP BY user_id
ORDER BY SUM( IF(`type`='add',+1,-1) * `value`) DESC
LIMIT 10

似乎工作:http ://sqlfiddle.com/#!2/dd207/1

SUM(IF())另一种选择,也许更快,也许不是,诀窍是从内部查询中移出部分:

http://sqlfiddle.com/#!2/dd207/9

SELECT
  user_id,
  SUM( IF(`type`='add',+1,-1) * `valuesum`)
FROM (
      SELECT
        user_id,
        `type`,
        SUM(`value`) AS `valuesum`
      FROM     Points
      GROUP BY user_id, `type`
     ) AS p
GROUP BY p.user_id
ORDER BY SUM( IF(`type`='add',+1,-1) * `valuesum`) DESC
LIMIT 10

可能这两种解决方案都必须进行全表扫描以总结所有内容,因此这种情况可能是一些明智的非规范化的良好候选者(例如,在另一个表中收集每个用户的总和)。

于 2012-06-22T20:34:31.693 回答