2016-10-19 10 views
0

私はプロジェクトに取り組んでおり、スキーマやクエリに変更が必要な場合や、変更が必要な場合は素早く参照したいと思っています。ランキングシステムを実装するにはどうすればいいですか

プロジェクトランキングは/試合

  • +2ポイントは優勝チームに与えられる大会で得点規則に基づいて行われますバドミントンチームのためのランキングシステムを作成する方法についてです。
  • マッチがクォーターフィナーレの場合、勝利チームにエクストラ+1ポイントが授与されます。
  • セミファイナルの場合は、追加の+2ポイントが勝利チームに授与されます。
  • ファイナルがファイナルだった場合、追加の+5ポイントが勝ちチームに授与されます。
  • すべてのプールマッチを獲得すると、チームの得点に4点が加算されます。
  • 3つ以上のトーナメントを獲得すると、あなたのチームに15ポイントが加算されます。私は、次の表

    プレーヤー

    +----------+-------------------------------------+------+-----+-------------- 
    | Field | Type        | Null | Key | +----------+-------------------------------------+------+-----+-------------- 
    | id  | int(11)        | NO | PRI | 
    | name  | varchar(250)      | NO |  | 
    | image | text        | YES |  | 
    | plays | enum('RH','LH')      | NO |  | 
    | added_on | datetime       | NO |  | 
    | status | enum('active','inactive','retired') | NO |  | +----------+-------------------------------------+------+-----+-------------- 
    

    チーム

    +------------+----------------------------+------+-----+-------------------+----------------+ 
        | Field  | Type      | Null | Key | Default   | Extra   | 
        +------------+----------------------------+------+-----+-------------------+----------------+ 
        | id   | int(11)     | NO | PRI | NULL    | auto_increment | 
        | name  | varchar(150)    | NO | UNI | NULL    |    | 
        | image  | text      | YES |  | NULL    |    | 
        | status  | enum('active','in-active') | NO |  | active   |    | 
        | added_on | datetime     | NO |  | CURRENT_TIMESTAMP |    | 
        | updated_on | datetime     | YES |  | NULL    |    | 
        +------------+----------------------------+------+-----+-------------------+----------------+ 
    

    プレイヤーにチームを作成することによって開始

+-----------+---------------------------+------+-----+-------------------+----------------+ 
| Field  | Type      | Null | Key | Default   | Extra   | 
+-----------+---------------------------+------+-----+-------------------+----------------+ 
| id  | int(11)     | NO | PRI | NULL    | auto_increment | 
| player_id | int(11)     | NO | MUL | NULL    |    | 
| team_id | int(11)     | NO |  | NULL    |    | 
| status | enum('active','inactive') | NO |  | NULL    |    | 
| added_on | datetime     | NO |  | CURRENT_TIMESTAMP |    | 
+-----------+---------------------------+------+-----+-------------------+----------------+ 

トーナメント

+-------+--------------+------+-----+---------+----------------+ 
| Field | Type   | Null | Key | Default | Extra   | 
+-------+--------------+------+-----+---------+----------------+ 
| id | int(11)  | NO | PRI | NULL | auto_increment | 
| name | varchar(255) | NO |  | NULL |    | 
| year | int(4)  | NO |  | NULL |    | 
+-------+--------------+------+-----+---------+----------------+ 

マッチ

+---------------+---------------------------------------+------+-----+-------------------+----------------+ 
| Field   | Type         | Null | Key | Default   | Extra   | 
+---------------+---------------------------------------+------+-----+-------------------+----------------+ 
| id   | int(11)        | NO | PRI | NULL    | auto_increment | 
| team_one  | int(11)        | NO | MUL | NULL    |    | 
| team_two  | int(11)        | NO |  | NULL    |    | 
| winner_id  | int(11)        | NO |  | NULL    |    | 
| tournament_id | int(11)        | NO | MUL | 1     |    | 
| added_on  | datetime        | NO |  | CURRENT_TIMESTAMP |    | 
| match_type | enum('pool','quarter','semi','final') | NO |  | pool    |    | 
| sets   | smallint(2)       | NO |  | 1     |    | 
+---------------+---------------------------------------+------+-----+-------------------+----------------+ 

マッチスコア

+----------+-------------------+------+-----+-------------------+----------------+ 
| Field | Type    | Null | Key | Default   | Extra   | 
+----------+-------------------+------+-----+-------------------+----------------+ 
| id  | int(11)   | NO | PRI | NULL    | auto_increment | 
| match_id | int(11)   | NO | MUL | NULL    |    | 
| team_id | int(11)   | NO | MUL | NULL    |    | 
| set_num | enum('1','2','3') | NO |  | NULL    |    | 
| score | smallint(2)  | NO |  | NULL    |    | 
| added_on | datetime   | NO |  | CURRENT_TIMESTAMP |    | 
+----------+-------------------+------+-----+-------------------+----------------+ 

プールあなたは私がランクスコアを任意の場所に保存していないと私は

SELECT 
    T.id, T.name, T.status, 
    IFNULL(T.image,'no-image.png') as DP, 
    (SELECT COUNT(*) 
    FROM badminton_matches M 
    WHERE (M.team_one = T.id OR M.team_two = T.id)) as played, 
    (SELECT COUNT(*) 
    FROM badminton_matches M 
    WHERE M.winner_id = T.id) as won, 
    (SELECT COUNT(*) 
    FROM badminton_matches M 
    WHERE ((M.team_one = T.id OR M.team_two = T.id) 
     AND (M.winner_id != T.id))) as lost, 
    (
     ((SELECT COUNT(*) 
     FROM badminton_matches M 
     WHERE M.winner_id = T.id) * 2) + 
     (((SELECT COUNT(*) 
     FROM badminton_matches M 
     WHERE (M.match_type = 'quarter' 
      AND M.winner_id = T.id)) * 2) + 1) + 
     (((SELECT COUNT(*) 
      FROM badminton_matches M 
      WHERE (M.match_type = 'semi' 
      AND M.winner_id = T.id)) * 2) + 2) + 
     (((SELECT COUNT(*) 
      FROM badminton_matches M 
      WHERE (M.match_type = 'final' AND M.winner_id = T.id)) * 2) + 5)) as Points 
FROM 
    badminton_teams T 
ORDER BY 
    (Points) DESC; 

まず次のクエリを使用して、実行時にそれを計算していますことに気づくでしょう

+---------------+-------------+------+-----+---------+----------------+ 
| Field   | Type  | Null | Key | Default | Extra   | 
+---------------+-------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| name   | varchar(10) | NO | UNI | NULL |    | 
| tournament_id | int(11)  | NO | MUL | NULL |    | 
+---------------+-------------+------+-----+---------+----------------+ 

一つ

  • クエリを使用して実行時に得点を計算するのは正しいですか

  • は、私は、この目的の

編集用のcronジョブをスケジュールする必要があり、それを私はデータベース

または

  • で試合結果を保存するたびに更新し保存する必要があります。

    クエリを次のように更新しました

     
    
    SELECT 
    T.id, T.name,T.status, 
    IFNULL(T.image,'no-image.png') as DP, 
    (SELECT COUNT(*) FROM badminton_matches M WHERE ((M.team_one =T.id or M.team_two = T.id) and M.winner_id IS NOT NULL)) as played, 
    (SELECT COUNT(*) FROM badminton_matches M WHERE M.winner_id=T.id) as won, (SELECT COUNT(*) FROM badminton_matches M WHERE ((M.team_one =T.id or M.team_two = T.id) AND (M.winner_id!=T.id))) as lost, 
    ((SELECT (SUM(BMS.points_won)-SUM(BMS.points_lost)) FROM 
    badminton_match_score BMS 
    JOIN badminton_matches M ON (M.id=BMS.match_id) where M.team_one=T.id OR M.team_two=T.id and M.winner_id is not null)/(SELECT COUNT(*) FROM badminton_matches M WHERE ((M.team_one =T.id or M.team_two = T.id) and M.winner_id IS NOT NULL))) AS AVG_SCORE, 
    (
          ((SELECT COUNT(*) FROM badminton_matches M WHERE M.winner_id=T.id)*2) + 
    (SELECT COUNT(*) FROM badminton_matches M WHERE (M.match_type='quarter' AND M.winner_id=T.id)) 
    
          + 
          ((SELECT COUNT(*) FROM badminton_matches M WHERE (M.match_type='semi' AND M.winner_id=T.id))*2) 
           + 
          ((SELECT COUNT(*) FROM badminton_matches M WHERE (M.match_type='final' AND M.winner_id=T.id))*5) 
          ) 
    as Points 
    FROM badminton_teams T 
    order by (Points) DESC, lost ASC, AVG_SCORE DESC 
     
    

答えて

1

それはあなたがそれをリアルタイムアプリケーションになりたい場合は、右のクエリ

を使用して、実行時に得点を計算することです。私の意見では、ポイントが蓄積されておらず、ゲームの後にリセットされるなら、はい。 SQLのパフォーマンス上の問題。

iは十分であろう歴史のために試合後のデータを保存し、それを私が

更新はデータのみの変更のためにあるデータベースに試合結果を保存するたびに更新し保存する必要があります。

大規模データベースや生産性の点でなら、私ははい、

この目的のためにcronジョブをスケジュールする必要があります。

+0

このクエリの1つの問題は、チームがまだ試合をしていなくても、あなたに8ポイントを与えることです –

関連する問題