【问题标题】:Top 10 collection completion - a monster in-query formula in MySQL?前 10 名收集完成 - MySQL 中的一个怪物查询公式?
【发布时间】:2011-02-06 20:39:46
【问题描述】:

我有以下表格:

用户基本数据(唯一)
[userid] [name] [etc]

用户收藏(一对一)
[userid] [game]

用户录制的播放(多对多)
[userid] [game] [scenario] [etc]

游戏基本数据(唯一)
[game] [total_scenarios]

我想输出一个表格,按百分比降序显示前 10 名用户的收藏播放完成百分比:

输出表

[userid]  [collection_completion]
   3               95%
   1               81%
  24               68%
  etc              etc

在我看来,ONE USER 的计算顺序是:

  1. User CollectionGame Basic DataCOUNT(gbd.total_scenarios) 中获取用户的总拥有场景
  2. 获取COUNT(DISTINCT scenario) 为该用户录制的所有播放内容
  3. 将所有录制的播放量除以拥有的场景总数

所以最后是 2 个查询和一点 PHP 按摩。对于按完成百分比排序的用户列表,事情变得有点复杂。

我想我可以在一个查询中获取所有用户的收藏总数,在另一个查询中所有用户记录播放,然后进行计算并对最终数组进行排序PHP,但是当我只想要前 10 名时,为 1000 多个用户做所有这些似乎有点过头了。

在 MySQL 中是否有一个邪恶的怪物查询可以做到所有这些和LIMIT 10?还是在这种情况下坚持使用 PHP 处理大部分工作?

【问题讨论】:

  • 您可以将百分比存储在其他地方(例如另一个表)并在您对User Recorded Plays 进行更改时更新它。那么这将是一个简单的 JOIN... ORDER BY percent。这在您的场景中可行吗?

标签: php mysql calculated-columns


【解决方案1】:

如果我正确理解您的要求,您可以尝试类似

SELECT  userid,
        us.TotalUserscenario / gbd.total_scenarios collection_completion
FROM    (
            SELECT  userid,
                    game,
                    COUNT(scenario) TotalUserscenario
            FROM    UserRecordedPlays urp
            GROUP BY    userid,
                        game
        ) UserScenarios us INNER JOIN
        GameBasicData gbd ON us.game = gbd.game
ORDER BY collection_completion DESC
LIMIT 10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 2012-07-25
    相关资源
    最近更新 更多