2017-03-16 7 views
0

クエリを書き直す手助けが必要です。私は現在、4つのフィールドは、profileID最高の20からの合計スコアであること「ladderscore」で私には、profileIDの明確なリストを示して「はしご」ビューを作成しようとしている複数の条件に基づくMySQL SUM()

+-----------+------------+----------+-----------------+ 
| profileid | scoretotal | matchwon | datematchplayed | 
+-----------+------------+----------+-----------------+ 

イムを持つ単一のテーブル「リーダーボード」を持っています過去21日間で一致します。

私は以下の文章で正しい出力を得ていますが、これを書き直す方法はありますか?

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; 
+0

ビューを作成しようとしていますか? – ARr0w

答えて

0

すべての一時テーブルが実行しているように見えるのは、実際のテーブルの合計行を減らすことです。

これが正しい場合は、最終クエリのテンポラリテーブルにある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; 

これはいくつかの調整が必要な場合がありますが、一般的な考え方を示す必要があります。

関連する問題