MySQL v5.0.58.
Таблицы с ограничениями внешнего ключа и т. Д., А также другие не относящиеся к делу подробности, опущенные для краткости:
CREATE TABLE `fixture` (
`id` int(11) NOT NULL auto_increment,
`competition_id` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
`scheduled` datetime default NULL,
`played` datetime default NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `result` (
`id` int(11) NOT NULL auto_increment,
`fixture_id` int(11) NOT NULL,
`team_id` int(11) NOT NULL,
`score` int(11) NOT NULL,
`place` int(11) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `team` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
);
Где:
- При розыгрыше
result
. place
будет установлено значение 0
result
. place
будет содержать целое число, представляющее первое место, второе место и т. Д.
Задача - вернуть строку, описывающую последний сыгранный результат в данном соревновании для данной команды. Формат должен быть «def Team X, Team Y», если данная команда одержала победу, «проиграл Team X», если данная команда проиграла, и «сыграл вничью с Team X», если была ничья. И да, теоретически может быть более двух команд на одно приспособление (хотя 1 на 1 будет наиболее распространенным случаем).
Это работает, но кажется действительно неэффективным:
SELECT CONCAT(
(SELECT CASE `result`.`place`
WHEN 0 THEN "drew with"
WHEN 1 THEN "def"
ELSE "lost to"
END
FROM `result`
WHERE `result`.`fixture_id` =
(SELECT `fixture`.`id` FROM `fixture`
LEFT JOIN `result` ON `result`.`fixture_id` = `fixture`.`id`
WHERE `fixture`.`competition_id` = 2
AND `result`.`team_id` = 1
ORDER BY `fixture`.`played` DESC
LIMIT 1)
AND `result`.`team_id` = 1),
' ',
(SELECT GROUP_CONCAT(`team`.`name`)
FROM `fixture`
LEFT JOIN `result` ON `result`.`fixture_id` = `fixture`.`id`
LEFT JOIN `team` ON `result`.`team_id` = `team`.`id`
WHERE `fixture`.`id` =
(SELECT `fixture`.`id` FROM `fixture`
LEFT JOIN `result` ON `result`.`fixture_id` = `fixture`.`id`
WHERE `fixture`.`competition_id` = 2
AND `result`.`team_id` = 1
ORDER BY `fixture`.`played` DESC
LIMIT 1)
AND `team`.`id` != 1)
)
Я пропустил что-то действительно очевидное или мне просто не следует пытаться сделать это одним запросом? Или текущая сложность отражает плохой дизайн стола?