Пожалуйста, помогите: сложный запрос - PullRequest
0 голосов
/ 01 декабря 2011

Я занимаюсь разработкой веб-сайта для покерного клуба, и они хотели бы показать рейтинг своих игроков. Игроки играют в турнирах, и за каждое размещение начисляется заранее определенное количество очков. Затем клуб хотел бы показать таблицу игроков, упорядоченных по накопленным очкам.

Клуб вводит эти данные в CMS, и есть четыре таблицы базы данных. Оператор create для этих таблиц (некоторые поля удалены для ясности):

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 очков за поражение), тогда как моя покерная лига В примере гораздо больше различий, поскольку это не случай выигрыша, проигрыша и ничьей.

Любая помощь в этом будет принята с благодарностью.

1 Ответ

0 голосов
/ 01 декабря 2011

Мне кажется, что вам нужно присоединиться tournaments_placings к placings, чтобы получить очки, связанные со всеми финишами.

Вы ищете общее количество очков для каждого игрока - поэтому вам нужно group by player_id и sum(points):

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

Если вы также хотите получить информацию об игроке (нетолько идентификатор), вы можете присоединиться к players.

...