【问题标题】:prize distribution on the basis of rank using mysql使用mysql根据排名分配奖品
【发布时间】:2022-01-19 04:16:57
【问题描述】:

我有两张桌子,一张是奖品桌,一张是结果桌

奖品表

pm_id pm_fromrank pm_torank pm_prize  pool_id
1     1           1         1000       72
2     2           5         500        72
3     6           10        270        72

RESULT TABLE 有 3 种类型的排名情况 第一个案例

  rs_id       rs_userid         rs_rank    rs_poolid
   1             131              1             72
   2             132              1             72
   3             133              2             72
   4             134              3             72
   5             135              4             72
   6             136              5             72
   7             137              6             72
   8             138              6             72
   9             139              7             72
   10            140              8             72
   11            141              9             72
   12            142              10            72

第二个案例

 rs_id        rs_userid         rs_rank    rs_poolid
   1             131              1             72
   2             132              2             72
   3             133              3             72
   4             134              4             72
   5             135              5             72
   6             136              6             72
   7             137              7             72
   8             138              8             72
   9             139              9             72
   10            140              10            72
   11            141              11            72
   12            142              12            72

第三个案例

rs_id        rs_userid        rs_rank     rs_poolid
   1             131              1             72
   2             132              2             72
   3             133              3             72
   4             134              4             72
   5             135              5             72
   6             136              6             72
   7             137              7             72
   8             138              8             72
   9             139              9             72
   10            140              10            72
   11            141              10            72
   12            142              10            72




now i have to distribute price only first 10 user in ascending order in following ways
1ST CASE PRIZE DISTRIBUTION
rs_id       rs_userid          rs_rank        rs_poolid      pricemoney
   1             131              1             72                750
   2             132              1             72                750
   3             133              2             72                500
   4             134              3             72                500
   5             135              4             72                500
   6             136              5             72                270
   7             137              6             72                270             
   8             138              6             72                270
   9             139              7             72                270
   10            140              8             72                270
   11            141              9             72                 0
   12            142              10            72                 0

第二个案例奖金分配

rs_id      rs_userid          rs_rank        rs_poolid        pricemoney
   1             131              1             72                1000
   2             132              2             72                500
   3             133              3             72                500
   4             134              4             72                500
   5             135              5             72                500
   6             136              6             72                270
   7             137              7             72                270             
   8             138              8             72                270
   9             139              9             72                270
   10            140              10            72                270
   11            141              11            72                 0
   12            142              12            72                 0

第三个案例奖品发放

rs_id        rs_userid          rs_rank      rs_poolid        pricemoney
   1             131              1             72                1000
   2             132              2             72                500
   3             133              3             72                500
   4             134              4             72                500
   5             135              5             72                500
   6             136              6             72                270
   7             137              7             72                270             
   8             138              8             72                270
   9             139              9             72                270
   10            140              10            72                 90
   11            141              10            72                 90
   12            142              10            72                 90

注意:- 奖品表和结果表与 POOL_ID 有关系 我必须使用mysql和codeignitor根据排名找到奖品分布

【问题讨论】:

  • 奖金分配的算法是绝对不清楚的,除了相同等级组的用户(第 1 名平局、前 5 名平局、前 10 名)的用户必须获得相等的金额。请明确和完整地制定这个算法。考虑第 10 位和第 11 位用户排名相同的情况。
  • 是的,如果第一名有 10 个平局,那么所有奖金将得到总和并除以第一名的 10 位用户,但在 10 人之后将不再分配奖金
  • 不要评论我的猜测。编辑问题并添加完整算法描述。 10人后不发放奖品 假设11个用户排名相同,即为最高。这 11 位用户中,哪些用户将被剥夺奖品,为什么?
  • 我认为您无法理解我已经提到的问题,如果第 11 位用户具有相同排名,则只有前 10 位用户将获得奖品,但奖品将仅分配给排名前 10 位的人,但现在奖金总额将除以10人
  • 在上面的问题中,我们需要考虑两件事,首先是具有相同等级和主键的用户,以便我们只分配前 10 人的奖品

标签: mysql codeigniter


【解决方案1】:

MySQL 8+版本的解决方案:

WITH 
cte1 AS (SELECT *,
                ROW_NUMBER() OVER (ORDER BY rs_rank, rs_id) rn,
                DENSE_RANK() OVER (ORDER BY rs_rank) drnk
         FROM result
         ORDER BY rs_rank, rs_id LIMIT 10),
cte2 AS (SELECT cte1.drnk, SUM(prize.pm_prize) totalmoney
         FROM cte1 
         JOIN prize ON cte1.rn BETWEEN prize.pm_fromrank AND pm_torank
         GROUP BY cte1.drnk),
cte3 AS (SELECT *,
                DENSE_RANK() OVER (ORDER BY rs_rank) drnk
         FROM result
         ORDER BY rs_rank, rs_id),
cte4 AS (SELECT MAX(drnk) max_drnk
         FROM cte1),
cte5 AS (SELECT rs_id, rs_rank, COUNT(*) OVER (PARTITION BY rs_rank) rank_count
         FROM cte3
         JOIN cte4 ON cte3.drnk <= cte4.max_drnk)
SELECT result.*, cte2.totalmoney / cte5.rank_count pricemoney
FROM cte5
JOIN result USING (rs_id)
JOIN cte2 ON result.rs_rank = cte2.drnk

fiddle 有解释。

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 2019-06-14
    • 1970-01-01
    • 2013-11-21
    • 2021-12-05
    相关资源
    最近更新 更多