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 X队,Y队”,如果给定的队伍输了,则“输给X队”,如果有抽牌,则“与X队队员队员队伍”。是的,理论上每个灯具可能有两个以上的团队(尽管1 v 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)
)
我是否错过了一些非常明显的内容,或者我是否应该在一次查询中尝试这样做?或者目前的难度是否反映了糟糕的桌面设计?
答案 0 :(得分:1)
尝试选择您需要的数据(团队名称和目标团队的place
),然后将其合并。对于每个夹具的两个团队:
SELECT CASE `recent`.`place`
WHEN 0 THEN CONCAT("drew with ", other_name)
WHEN 1 THEN CONCAT("def ", other_name, ", ", targ_name)
ELSE CONCAT("lost to ", other_name)
END
FROM (SELECT rtarg.place, targ.name AS targ_name, other.name AS other_name
FROM `fixture`
JOIN `result` AS rtarg ON `rtarg`.`fixture_id` = `fixture`.`id`
JOIN `team` AS targ ON `rtarg`.`team_id` = `targ`.`id`
JOIN `result` AS rother ON `rother`.`fixture_id` = `fixture`.`id`
JOIN `team` AS other ON `rother`.`team_id` = `other`.`id`
WHERE `fixture`.`competition_id` = 2
AND `rtarg`.`team_id` = @targ
AND `rother`.`team_id` != @targ
ORDER BY `fixture`.`played` DESC
LIMIT 1) AS `recent`;
每个灯具可以通过最少的更改来处理两个以上的团队,但其他子查询也可以。
SELECT CASE `recent`.`place`
WHEN 0 THEN CONCAT("drew with ", other_names)
WHEN 1 THEN CONCAT("def ", other_names, "; ", targ_name)
ELSE CONCAT("lost to ", other_names)
END
FROM (SELECT rtarg.place, targ.name AS targ_name, GROUP_CONCAT(other.name SEPARATOR ', ') AS other_names
FROM `fixture`
JOIN `result` AS rtarg ON `rtarg`.`fixture_id` = `fixture`.`id`
JOIN `team` AS targ ON `rtarg`.`team_id` = `targ`.`id`
JOIN `result` AS rother ON `rother`.`fixture_id` = `fixture`.`id`
JOIN `team` AS other ON `rother`.`team_id` = `other`.`id`
WHERE `fixture`.`competition_id` = 2
AND `targ`.`id` = @targ
AND `rother`.`team_id` != @targ
AND ((rtarg.place<=1 AND rother.place >= rtarg.place)
OR (rtarg.place>1 AND rother.place < rtarg.place))
GROUP BY fixture.id
ORDER BY `fixture`.`played` DESC
LIMIT 1
) AS recent;
未指定每个灯具两个以上团队的结果格式,因此可能需要进一步调整。