【问题标题】:Need help in database query for contest winners在竞赛获胜者的数据库查询中需要帮助
【发布时间】:2019-08-26 07:32:41
【问题描述】:

我正在创建一个网络应用程序,用户可以在其中参加比赛,并根据他们的排名,用户将获得奖励。

(桌名竞赛)

id    |   contest_name   |   status
------------------------------------
1     |   Test Contest   |   active

(表参与者)

id    |    user_id   | contest_id   | score   | time_taken  
----------------------------------------------------------
1     |    123       |     1        |  10     |   2332  --> in milliseconds

我的比赛桌奖品分配(桌名 price_distribution)

id   |  contest_id  |  rank_start  | rank_end  | price
-------------------------------------------------------
1    |    1         |     1         |   10     |   50
-------------------------------------------------------
2    |    1         |     11        |   20     |   25
-------------------------------------------------------

意思是如果所有排名在1到10之间的用户,他们将获得50分,排名在11-20之间,20分等等。

我已使用此查询来获取比赛中的所有用户列表及其排名。

SELECT participants.score,
       participants.time_taken, 
       contest.name as contest_name, 
       user.name as username,
       user.image as userimage, 
       FIND_IN_SET( participants.score, (SELECT GROUP_CONCAT( participants.score ORDER BY participants.score DESC, participants.time_taken ASC ) 
                                         FROM participants )) AS rank
FROM participants 
LEFT JOIN contest 
ON participants.contest_id = contest.id 
LEFT JOIN user ON user.id = participants.user_id 
WHERE participants.contest_id = '1' 
ORDER BY participants.score DESC, participants.time_taken ASC 
LIMIT 50

以上查询结果是这样的

score   |  time_taken  | contest_name  | username  | userimage  | rank  
-----------------------------------------------------------------------
10      |   2356       |  test_contest |  abc      |  image     | 1
-----------------------------------------------------------------------

上面的查询只根据排名列出用户,没有做任何其他事情。 我想根据排名奖励用户。如何实现这个查询。

我想知道执行时会根据用户的排名奖励用户并从奖品分配表中获取值的查询。

任何帮助将不胜感激。

【问题讨论】:

    标签: php mysql database


    【解决方案1】:

    您可以根据用户的分数加入表price_distribution

    SELECT participants.score,
           participants.time_taken, 
           contest.name as contest_name, 
           user.name as username,
           user.image as userimage, 
           FIND_IN_SET( participants.score, (SELECT GROUP_CONCAT( participants.score ORDER BY participants.score DESC, participants.time_taken ASC ) 
                                             FROM participants )) AS rank,
           pd.price
    FROM participants 
    LEFT JOIN contest ON participants.contest_id = contest.id 
    LEFT JOIN user ON user.id = participants.user_id 
    LEFT JOIN price_distribution pd 
    ON participants.contest_id = pd.contest_id and participants.score BETWEEN pd.rank_start AND pd.rank_end
    WHERE participants.contest_id = '1' 
    ORDER BY participants.score DESC, participants.time_taken ASC 
    LIMIT 50
    

    【讨论】:

      猜你喜欢
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      相关资源
      最近更新 更多