mysql - 需要帮助构建 SQL SELECT 语句以获取 "top 10 x"

标签 mysql sql

我有这个 Points 表:

===========================================
FIELD           :      TYPE
===========================================
id                 int(11)
user_id            int(11)
value              int(11)
type               enum('add','subtract')
timestamp          int(11)
===========================================

基本上这个表存储的是用户积分的记录。

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

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

提前致谢

最佳答案

我会尝试这样的事情:

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

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

关于mysql - 需要帮助构建 SQL SELECT 语句以获取 "top 10 x",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11163650/

相关文章:

php - 中文文本插入数据库后变得不可读?

php - 如何更新字段以将值添加到现有值?

php - 在表中显示来自查询的行

MySQL 添加额外的反斜杠?

mysql - SailsJS 1.0 : Error in . create() Mongo 中的模型与存储在 MySQL 中的模型的单向关联

PHP/MySQL : Compare cells in one column and overwrite matching substrings in another column or table

sql - 如何在 PostgreSQL 中以日期格式本身添加 AM 或 PM?

mysql - AVG 返回 null 但不应返回 null

php - 用户登录(使用 session )问题

mysql - 在rails中,如何查询连接表中的字段?