MySQL查询按列排名

时间:2014-07-30 07:43:30

标签: php mysql sql

我在php中运行一个查询,它以这种格式给我一个表:

+--------------------------------------------------------------------------+
|   Name               cc          Platform         Playcount      Date    |
+--------------------------------------------------------------------------+
| The Godfather      IN           Web              20000            20140701 |
| The Godfather      IN           Mob              210            20140701 |
| The Godfather      US           Web              221            20140701  |
| The Godfather      US           Mob              1200            20140701 |
| Pulp Fiction      IN           Web              1300            20140701  |
| Pulp Fiction      IN           Mob              20            20140701  |
| Pulp Fiction      US           Web              222            20140701   |
| Pulp Fiction      US           Mob              100            20140701  |
| Fight Club      IN           Web              2002            20140701    |
| Fight Club      IN           Mob              2100            20140701    |
| Fight Club      US           Web              2           20140701     |
| Fight Club      US           Mob              1000            20140701    |
+--------------------------------------------------------------------------+

问题是,我需要按总游戏次数对它们进行排名。也就是说,教父显然在这张桌子中拥有最多的游戏数量。排名后,我需要选择前20个总播放电影,相应的4行必须输入一个单独的表。

如何进行此排名以获取总数,然后将与其对应的所有四行插入到新表中?

所以,在这个示例表中,如果我想要排名前2的项目,我会在表格中插入

+--------------------------------------------------------------------------+
|   Name               cc          Platform         Playcount      Date    |
+--------------------------------------------------------------------------+
| The Godfather      IN           Web              20000            20140701 |
| The Godfather      IN           Mob              210            20140701 |
| The Godfather      US           Web              221            20140701  |
| The Godfather      US           Mob              1200            20140701 |
| Fight Club      IN           Web              2002            20140701    |
| Fight Club      IN           Mob              2100            20140701    |
| Fight Club      US           Web              2           20140701     |
| Fight Club      US           Mob              1000            20140701    |
+--------------------------------------------------------------------------+ 

2 个答案:

答案 0 :(得分:1)

这是一个可怕的格式化(可能是错误的LoL)查询,应该做你需要的。欢迎任何人提供反馈以改进它。

INSERT INTO top20 (name, cc, platform, playcount, date) 
SELECT 
    Name, 
    cc,
    Platform,
    Playcount,
    date
FROM
(SELECT 
    m.Name, 
    m.cc,
    m.Platform,
    m.Playcount,
    m.date,
    m2.TotalPlayCount 
FROM Movies m
LEFT JOIN (
    SELECT 
        Name, 
        SUM(Playcount) as TotalPlayCount 
    FROM Movies 
    GROUP BY Name 
    ORDER BY TotalPlayCount DESC 
    LIMIT 20) as m2
USING (Name)
ORDER BY TotalPlayCount DESC, Name, cc, Platform) as temp
-- if the final inserted data is not in the order you want, add more ORDER clause here

答案 1 :(得分:0)

如果一个小组与一个订单相结合怎么样?

SELECT 
    Name, 
    SUM(Playcount) as TotalPlayCount 
FROM Movies 
GROUP BY Name 
ORDER BY TotalPlayCount DESC 
LIMIT 0, 20

然后可以将其添加到新表中

INSERT INTO Statistics (Name, Playcount) 
SELECT 
    Name, 
    SUM(Playcount) as TotalPlayCount 
FROM Movies 
GROUP BY Name 
ORDER BY TotalPlayCount DESC
相关问题