Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 需要帮助构造SQL SELECT语句以获得“前10X”_Mysql_Sql - Fatal编程技术网

Mysql 需要帮助构造SQL SELECT语句以获得“前10X”

Mysql 需要帮助构造SQL SELECT语句以获得“前10X”,mysql,sql,Mysql,Sql,我有这个积分表: 基本上,此表存储用户点的记录 现在我的问题是:我如何获得总分最高的前10名用户 注意:我被告知要更改模式-删除“type”字段,并为“value”字段添加正值和负值。我只是想知道是否可以使用当前模式实现所需的查询 提前谢谢我想试试这样的东西: SELECT user_id, SUM( IF(`type`='add',+1,-1) * `value`) AS user_points FROM Points GROUP BY user_id ORDER BY SUM( IF

我有这个积分表:

基本上,此表存储用户点的记录

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

注意:我被告知要更改模式-删除“type”字段,并为“value”字段添加正值和负值。我只是想知道是否可以使用当前模式实现所需的查询


提前谢谢

我想试试这样的东西:

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
似乎有效:

或者,可能更快,也可能不是,诀窍是从内部查询移出SUMIF部分:


可能这两种解决方案都必须进行完整的表扫描以汇总所有内容,因此这种情况可能是某种明智的非规范化方法的很好选择,例如,在另一个表中收集每个用户的总和。

您肯定可以使用您的模式进行此操作。无需更改。您可以使用您的模式进行更改,但如果您按照建议进行操作,它会更优化。@RedFilter尝试了biziclop的答案,结果成功了!谢谢基本思想是正确的,但不应将*与GROUP BY一起使用,并且ORDER BY应为DESC。
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
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