SQL模式站点负责人委员会

时间:2019-07-02 00:58:39

标签: sql database-design mariadb

因此,我试图建立一个具有挑战性的网站,然后希望将其转换为每个挑战的排行榜,然后再转换为历史排行榜。

所以我有一个如下所示的挑战表:

Challenge ID    Challenge Name  Challenge Date  Sport   Prize Pool  

然后我需要一种方法,使每个挑战都有自己的领导委员会,例如50人。

由挑战ID链接,其中=排行榜ID

我有一个由50个人组成的排行榜,看起来像这样:

Challenge ID     User             Place            Prize Won

我的问题是两件事:

  1. 将新挑战添加到挑战表时,如何使表自动创建?

  2. 如何为每个挑战获得一个A网站范围的排行榜,因此它将显示以下内容:

    Rank        USER          Prize Money Won(total every challenge placed)
    

    ,然后按赢得多少钱的顺序排列。

我知道这是很多问题,全部都包含在一个问题中,即模式设计和逻辑。

任何见解都会受到赞赏

1 个答案:

答案 0 :(得分:0)

与每个挑战一张桌子相比,

一种更好的方法是针对所有挑战使用一张桌子。这样,您可以在同一张表中计算总计和个人挑战排名。您还不希望直接记录该地点,而是根据您想要处理领带的方式使用适当的窗口函数即时计算该地点(rank()dense_rank()row_number()在这些情况下有不同的结果);这样,您在添加新记录时就不必不断调整它。

类似这样的表(您没有指定SQL数据库,因此我将假定Sqlite。根据需要进行调整。):

CREATE TABLE challenge_scores(user_id INTEGER REFERENCES users(id),
                              challenge_id INTEGER REFERENCES challenges(id),
                              prize_amount NUMERIC,
                              PRIMARY KEY(user_id, challenge_id));

会让您做类似的事情

SELECT *
FROM (SELECT user_id,
             sum(prize_amount) AS total,
             rank() OVER (ORDER BY sum(prize_amount) DESC) AS place 
      FROM challenge_scores
      GROUP BY user_id)
WHERE place <= 50
ORDER BY place;

用于全球排行榜,或类似的内容:

SELECT *
FROM (SELECT user_id,
             prize_amount,
             rank() OVER (ORDER BY prize_amount DESC) AS place 
      FROM challenge_scores
      WHERE challenge_id = :some_challenge_id
      GROUP BY user_id)
WHERE place <= 50
ORDER BY place;

针对特定挑战。