[英]MySQL SUM() based on multiple conditions
我需要帮助来重写查询。 我目前只有一个表格“排行榜”,其中包含4个字段
+-----------+------------+----------+-----------------+
| profileid | scoretotal | matchwon | datematchplayed |
+-----------+------------+----------+-----------------+
我试图创建一个“梯子”视图,向我显示一个不同的profileid列表,其中“ laddercore”是过去21天中20个最符合条件的profileid的总得分。
我在下面的语句给了我正确的输出,但是有什么方法可以重写它,因此它不使用放置/创建模板?
DROP TABLE IF EXISTS templeaderboard;
CREATE TABLE templeaderboard (INDEX(id), INDEX(profileid)) AS
( SELECT * FROM realleaderboard WHERE datematchplayed > unix_timestamp() - 1814400 ) ;
SELECT a.profileid, SUM(IF(a.matchwon = 1, a.scoretotal * 1.5, a.scoretotal)) AS ladderscore
FROM templeaderboard AS a
WHERE (SELECT COUNT(*) FROM templeaderboard AS b
WHERE b.profileid = a.profileid AND b.scoretotal >= a.scoretotal) <= 20
GROUP BY a.profileid
ORDER BY ladderscore DESC;
在我看来,您的所有临时表正在做的事情是减少实际表的总行数。
如果是正确的话,则应该将临时表中的where
子句移至最终查询,并将最终查询的where
条件更改为having
。
SELECT a.profileid,
SUM(IF(a.matchwon = 1, a.scoretotal * 1.5, a.scoretotal)) AS ladderscore
FROM realleaderboard AS a
JOIN realleaderboard AS b
ON a.profileid = b.profileid and b.scoretotal >= a.scoretotal
WHERE a.datematchplayed > unix_timestamp() - 1814400 AND
b.datematchplayed > unix_timestamp() - 1814400
GROUP BY a.profileid
HAVING count(*) <= 20
ORDER BY ladderscore DESC;
这可能需要一些调整,但是它应该可以为您提供总体思路。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.