Как выбрать текущего владельца для каждого чемпионата? - PullRequest
0 голосов
/ 13 июня 2011

Я хочу выбрать текущих владельцев для каждого чемпионата в таблице championships и вернуть NULL для чемпионатов, в которых еще не было победителей.

Вот операторы создания для двух таблиц:

CREATE TABLE `championships` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `friendly_name` varchar(255) NOT NULL,
  `rank` int(2) unsigned NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`),
  UNIQUE KEY `friendly_name` (`friendly_name`)
) ENGINE=InnoDB;

CREATE TABLE `title_history` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `championship` int(10) unsigned NOT NULL,
  `winner` varchar(255) NOT NULL,
  `date_from` date NOT NULL,
  `location` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `championship` (`championship`)
) ENGINE=InnoDB;

ALTER TABLE `title_history` ADD CONSTRAINT `title_history_ibfk_1` FOREIGN KEY (`championship`) REFERENCES `championships` (`id`) ON UPDATE CASCADE;

Какой оператор MySQL вернет набор данных, который я хотел?

1 Ответ

0 голосов
/ 13 июня 2011

Предполагая, что вы сохраняете победителя чемпионата в качестве первичного ключа / идентификатора владельца, что-то вроде этого должно работать.Возможно, вы захотите добавить еще одно объединение, чтобы получить реальное имя команды из другой таблицы.

Поскольку при левом соединении строки из «правильной» таблицы выбираются только при совпадении, все, что не происходит, -он должен возвращаться как NULL.

SELECT name, [holder] 
FROM championships AS c
LEFT JOIN title_history AS h ON c.winner = h.id

РЕДАКТИРОВАННАЯ ВЕРСИЯ:

С дальнейшим пониманием ваших таблиц и вашего комментария, возможно, попробуйте этот подвыбор:

SELECT friendly_name, 
       (SELECT winner FROM title_history WHERE championship = c.id ORDER BY date_from DESC LIMIT 1) 
FROM championships AS c
ORDER BY name

Если я правильно понимаю вашу структуру, что должен получить последний победитель каждого чемпионата?

...