2011-12-01 40 views
0

我正在爲撲克俱樂部開發一個網站,他們想顯示他們的球員的排名。玩家在比賽中進行比賽,並且每次投注都會獲得預定數量的積分。俱樂部然後想要顯示按累計積分排列的玩家表格。請協助:複雜的排名查詢

俱樂部進入在CMS這個數據,並有四個數據庫表。這些表的創建語句是(某些字段爲清楚起見移除):

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`); 

希望這是不言自明它是如何與表命名結構聯繫起來,但國外的關鍵信息在那裏。

還有第五個表,placings,它有兩列:placing_id這只是一個PRIMARY KEY列;和points,其中存儲應爲該配售獎勵多少分。

問:將我的查詢看起來像以拉在所有比賽的過程中所有玩家的累積點什麼,根據我在placings表中定義的點結構?

我見過各種解決方案,像足球聯盟表,但在查詢中有點系統(即3分爲贏,1分爲抽籤,0分爲虧),而我的撲克聯賽的例子有更多的變化,因爲它不是贏得,失去,繪製的情況。

任何幫助,將不勝感激。

+0

看來你有缺陷,一名球員只能參加一次單場比賽?如果是這樣,在player_id + tournament_id上應該有主鍵或唯一鍵(然後不需要players_tournaments) – ajreal

回答

0

它在我看來像你需要加入tournaments_placingsplacings,以獲得與所有完成相關的點。

您正在尋找適合每個玩家的總積分 - 所以你需要group by player_idsum(points)

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

如果你也想獲得玩家信息(不僅僅是ID),你就可以加入到players