繁体   English   中英

基于多个条件的MySQL SUM()

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM