代码之家  ›  专栏  ›  技术社区  ›  Drew

十大收集完成-一个怪物在查询公式在MySQL?

  •  1
  • Drew  · 技术社区  · 16 年前

    我有下表:

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

    用户集合(一对一)
    [userid] [game]

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

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

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

    输出表

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

    在我看来,一个用户的计算顺序是:

    1. 从中获取用户的总拥有方案 User Collection 加入 Game Basic Data 和 COUNT(gbd.total_scenarios)
    2. 获取所有录制的播放 COUNT(DISTINCT scenario) 对于那个用户
    3. 将所有录制的剧集除以总拥有剧情

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

    我想我可以抓住 所有用户的集合总数 在一个查询中,以及 所有用户都录制了播放 在另一个例子中,然后用PHP对最后一个数组进行计算和排序,但是当我只想要前10名的时候,对1000多个用户进行所有这些操作似乎有些过分了。

    在MySQL中有没有一个邪恶的怪物查询可以做到这一切? LIMIT 10 ?或者在这种情况下,坚持使用PHP来处理大部分工作?

    1 回复  |  直到 16 年前
        1
  •  2
  •   Adriaan Stander    16 年前

    如果我理解你的要求,你可以尝试

    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
    
    推荐文章