2011-12-01 18 views
0

私はポーカークラブのウェブサイトを開発しており、彼らは選手の順位を見せたいと思います。プレイヤーはトーナメントでプレーし、各配置ごとに所定のポイントが与えられます。クラブは、累積ポイントで注文された選手のテーブルを表示したいと考えています。助けてください:複雑な順位付けのクエリ

クラブはこのデータをCMSに入力し、4つのデータベーステーブルがあります。うまくいけば、それはテーブルの命名構造でリンクアップする方法として自明だ

CREATE TABLE `players` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(128) COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `name` (`name`) 
); 

CREATE TABLE `players_tournaments` (
    `player_id` int(10) unsigned NOT NULL, 
    `tournament_id` int(10) unsigned NOT NULL, 
    KEY `player_id` (`player_id`), 
    KEY `tournament_id` (`tournament_id`) 
); 

CREATE TABLE `tournaments` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `date` date NOT NULL, 
    `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL 
    PRIMARY KEY (`id`) 
); 

CREATE TABLE `tournaments_placings` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `tournament_id` int(10) unsigned NOT NULL, 
    `player_id` int(10) unsigned NOT NULL, 
    `placing_id` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `tournament_id` (`tournament_id`), 
    KEY `player_id` (`player_id`), 
    KEY `placing_id` (`placing_id`) 
); 

ALTER TABLE `players_tournaments` 
    ADD CONSTRAINT `players_tournaments_ibfk_3` FOREIGN KEY (`player_id`) REFERENCES `players` (`id`), 
    ADD CONSTRAINT `players_tournaments_ibfk_4` FOREIGN KEY (`tournament_id`) REFERENCES `tournaments` (`id`); 

ALTER TABLE `tournaments_placings` 
    ADD CONSTRAINT `tournaments_placings_ibfk_1` FOREIGN KEY (`tournament_id`) REFERENCES `tournaments` (`id`), 
    ADD CONSTRAINT `tournaments_placings_ibfk_2` FOREIGN KEY (`player_id`) REFERENCES `players` (`id`), 
    ADD CONSTRAINT `tournaments_placings_ibfk_3` FOREIGN KEY (`placing_id`) REFERENCES `placings` (`placing`); 

が、外部キー情報がありすぎである。これらのテーブルの作成文は(明確にするため取り除かいくつかのフィールド)です。

5つ目のテーブルplacingsもあります。これは2つのカラム:placing_idです。ちょうどPRIMARY KEYカラムです。その配置に与えられるポイント数を格納するpoints

質問:何私のクエリは私のplacingsテーブルに定義されたポイントの構造に基づいて、すべてのトーナメントの過程ですべてのプレーヤーの累積ポイントを引くために、次のようになりますか?

私はサッカーリーグのテーブルのようなものに対して様々な解決策を見ましたが、それは質問内にポイントシステムを持っています(つまり、勝利のための3ポイント、抽選のための1ポイント、損失の0ポイント)リーグの例は、勝利、敗北、抽選のケースではないので、より多くの分散を持っています。

これについてのお手伝いがあれば幸いです。

+0

あなたは欠陥があるようですが、プレイヤーはシングルトーナメントで1回しか参加できませんか?その場合は、player_id + tournament_idにプライマリキーまたはユニークキーが存在する必要があります(players_tournamentsは必須ではありません) – ajreal

答えて

0

tournaments_placingsplacingsに参加する必要があるようですが、すべての仕上げに関連するポイントを取得するために私に見えます。

あなたは、各プレイヤーの合計ポイントを探している - あなたはgroup by player_idsum(points)に必要なので:あなたはまた、プレイヤーの情報(だけでなく、ID)を取得したい場合は

select 
    player_id, sum(points) 
from 
    tournaments_placings 
inner join 
    placings 
    using(placing_id) 
group by 
    player_id; 

、あなたがすることができ、その後playersに参加してください。

関連する問題