MySQL v5.0.58. 간결함을 위해 생략 외부 키 제한 조건 등 및 기타 비 관련 세부'WITH'를 사용할 수없는 경우 반복되는 서브 쿼리 피하기
테이블 :
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
to 0 result
.place
에는 1 위, 2 위 등을 나타내는 정수가 포함됩니다.
주어진 팀의 주어진 경기에서 가장 최근에 재생 된 결과를 설명하는 문자열을 반환하는 작업입니다. 형식은 팀이 승리했다면 "팀 X, 팀 Y"를, 주어진 팀이 손실되면 "팀 X에게", 추첨이 있었다면 "팀 X와 함께"가져와야합니다. 그리고 예, 이론적으로 조명기 당 2 개 이상의 팀이있을 수 있습니다 (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)
)
난 정말 분명 뭔가를 놓친, 또는 단순히 하나 개의 쿼리에서이 작업을 수행하려고하지 않겠습니까? 아니면 현재의 어려움이 가난한 테이블 디자인을 반영합니까?
"잃어버린"사례는 실제로 승리 팀만 표시해야하기 때문에보다 신중하게 처리해야합니다. –
경기에 참가할 팀 수는 몇 개입니까? – outis
나는 그것에 대한 경계가 없기 때문에 조명기가 결과와 분리되어있는 현재의 테이블 디자인을 사용합니다. 일부 게임 (여기에서 컴퓨터 게임을 말하는 중입니다)에는 경기 당 3 개 이상의면이 있습니다 (예 : Dawn of War와 같은 RTS). –