使用 mysql 根据排名分配奖金

prize distribution on the basis of rank using mysql

我有两个table,一个是奖品table,一个是结果table

奖品TABLE

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

注意:- 奖品 TABLE 和结果 TABLE 与 POOL_ID 有关系 我必须使用 mysql 和 codeignitor

根据排名找到奖金分配

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 有解释。