棘手的SQL查询

sam*_*nai 5 sql join

我在这里真的很棘手的SQL语句.尝试构建此查询大约一小时.也许你可以帮助我.

我们有一个包含3列的表:gamename | 用户| TIMES_PLAYED

查询应该选择前三个游戏(取决于总时间数量)和在此游戏中玩过多次的前三个用户=> 9行.

The result is like:
CounterStrike | Smith 
CounterStrike | Jonny
Counterstrike | Hans
WoW           | George
WoW           | Bob
Wow           | Frank
Need For Speed| James
Need For Speed| Marion
Need For Speed| Scarlet
Run Code Online (Sandbox Code Playgroud)

会很好,如果你能帮助我=)谢谢!

Qua*_*noi 13

更新:

正如所@Steve Kass指出的,我没有注意到你只想要前三场比赛.

这是更新版本:

SQL Server,OraclePostgreSQL 8.4:

SELECT  gamename, user
FROM    (
        SELECT  r.gamename, user,
                ROW_NUMBER() OVER (PARTITION BY game ORDER BY times_played DESC) rn,
        FROM    (
                SELECT  gamename, ROW_NUMBER() OVER (ORDER BY SUM(times_played) DESC) AS game_rn
                FROM    results
                GROUP BY
                        gamename
                ) g
        JOIN    results r
        ON      r.gamename = g.gamename
        WHERE   game_rn <= 3
        ) q
WHERE   rn <= 3
ORDER BY
        gamename, times_played DESC
Run Code Online (Sandbox Code Playgroud)

MySQL:

SELECT  ro.gamename, ro.user
FROM    (
        SELECT  gamename, SUM(times_played) AS rank
        FROM    results
        ORDER BY
                rank DESC
        LIMIT 3
        ) rd
JOIN    results ro
ON      ro.gamename >= rd.gamename
        AND ro.gamename <= rd.gamename
        AND
        (ro.times_played, ro.id) <=
        (
        SELECT  ri.times_played, ri.id
        FROM    results ri
        WHERE   ri.gamename = rd.gamename
        ORDER BY
                ri.times_played DESC, ri.id DESC
        LIMIT 2, 1
        )
ORDER BY
        gamename, times_played DESC
Run Code Online (Sandbox Code Playgroud)

PRIMARY KEY假设它被调用,您将需要一个for这个查询id.

我的博客在本文中对此进行了更详细的解释:

PostgreSQL 8.3及以下:

SELECT  gamename, ((ri)[s]).user
FROM    (
        SELECT  gamename, ri, generate_series(1, 3) AS s
        FROM    (
                SELECT  ro.gamename,
                        ARRAY
                        (
                        SELECT  ri
                        FROM    results ri
                        WHERE   ri.gamename = ro.gamename
                        ORDER BY
                                times_played DESC
                        LIMIT 3
                        ) AS ri
                FROM    (
                        SELECT  gamename, SUM(times_played) AS rank
                        FROM    results
                        ORDER BY
                                rank DESC
                        LIMIT 3
                        ) rd
                ) q
        ) q2
ORDER BY
        gamename, s
Run Code Online (Sandbox Code Playgroud)

  • 当你回答它时,它似乎很容易:-) (3认同)