【问题标题】:SQL for list of winners that have won at least a specific percentage of times至少赢得特定百分比的获胜者列表的 SQL
【发布时间】:2013-11-07 19:58:00
【问题描述】:

我必须设置一个对抗模块,用户可以在其中为个人资料 A 或 B 投票。每条记录将存储 3 个重要值:投票的人、获胜的人、失败的人。

用户

  • id_user
  • 姓名

user_versus

  • id_versus - 主键
  • id_user - 投票者
  • id_user_winner - 显然是赢家
  • id_user_loser - 失败者

我可以通过分别执行这些查询来计算用户的百分比:

  • $wins = 'SELECT COUNT(*) FROM user_versus WHERE id_user_winner = 6';
  • $loses = 'SELECT COUNT(*) FROM user_versus WHERE id_user_loser = 6';
  • $total = $wins + $loses;

所以 %wins = $wins / $total

不过,我相信可以将查询优化为一个,然后将其用作报告查询的子查询(这是我真正需要帮助的查询)。报告需要返回:

胜率大于指定用户胜率的用户列表

我不知道如何从这一点开始。任何提示都会有所帮助。谢谢!

【问题讨论】:

    标签: php mysql sql percentage


    【解决方案1】:

    对于一个用户:

    SELECT ifnull(wins, 0) wins, ifnull(loses,0) loses, 
           ifnull(wins, 0)+ifnull(loses,0) total, 
           ifnull(wins, 0) / ( ifnull(wins, 0)+ifnull(loses,0)) percent
    FROM (
    SELECT
     (SELECT COUNT(*) FROM user_versus WHERE id_user_winner = 6 ) wins,
     (SELECT COUNT(*) FROM user_versus WHERE id_user_loser = 6 ) loses
    ) subqry
    

    对于所有用户:

    SELECT id_user_winner AS id_user, 
           ifnull(wins, 0) wins
           ifnull(loses,0) loses
           ifnull(wins, 0)+ifnull(loses,0) total, 
           ifnull(wins, 0) / ( ifnull(wins, 0)+ifnull(loses,0)) percent
    FROM (
       SELECT id_user_winner AS id_user FROM user_versus 
       UNION
       SELECT id_user_loser FROM user_versus 
    ) u
    LEFT JOIN
    FROM (
      SELECT id_user_winner, count(*) wins
      FROM user_versus 
      GROUP BY id_user_winner
    ) w
    ON u.id_user = id_user_winner
    LEFT JOIN (
      SELECT id_user_loser, count(*) loses
      FROM user_versus 
      GROUP BY id_user_loser
    ) l
    ON u.id_user = l.id_user_loser
    

    【讨论】:

    • 如果你有一个没有损失的用户会发生什么?如果您有一个没有获胜的用户会发生什么?我建议你从用户开始,对你的内联视图做两个左连接。当然,您需要注意两者都没有的用户(除以零)
    • @Conrad Frix 非常感谢您的评论。我更正了答案。除以 0 是不可能的,因为查询检索到的每个用户必须始终是赢家或输家,或两者兼而有之。我们除以赢+输的总和,这个总和必须始终> 0。
    • @kordirko 为什么我也会得到具有 NULL 值的 id_user 列?试图弄清楚但没有成功......:s
    猜你喜欢
    • 2020-10-06
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 2015-11-02
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多