2011-12-01 42 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