Mysql 需要帮助构造SQL SELECT语句以获得“前10X”
我有这个积分表: 基本上,此表存储用户点的记录 现在我的问题是:我如何获得总分最高的前10名用户 注意:我被告知要更改模式-删除“type”字段,并为“value”字段添加正值和负值。我只是想知道是否可以使用当前模式实现所需的查询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
提前谢谢我想试试这样的东西:
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