I have 2 tables:
Matches
x
CREATE TABLE rounds (
`roundid` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`roundname` VARCHAR(45) NULL);
Rounds
CREATE TABLE matches (
`matchid` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`matchwinner` VARCHAR(45) NULL,
`roundid` INT NOT NULL,
CONSTRAINT `fk_matches_rounds`
FOREIGN KEY (`roundid`)
REFERENCES `mydb`.`rounds` (`roundid`)
ON DELETE CASCADE
ON UPDATE CASCADE);
Inserts
INSERT INTO rounds (`roundid`, `roundname`) VALUES (1, 'Final');
INSERT INTO rounds (`roundid`, `roundname`) VALUES (2, '3rd place');
INSERT INTO matches (`matchid`, `matchwinner`, `roundid`) VALUES (1, 'fnatic', 1);
INSERT INTO matches (`matchid`, `matchwinner`, `roundid`) VALUES (2, 'astralis', 1);
INSERT INTO matches (`matchid`, `matchwinner`, `roundid`) VALUES (3, 'fnatic', 2);
INSERT INTO matches (`matchid`, `matchwinner`, `roundid`) VALUES (4, 'fnatic', 2);
INSERT INTO matches (`matchid`, `matchwinner`, `roundid`) VALUES (5, 'astralis', 1);
INSERT INTO matches (`matchid`, `matchwinner`, `roundid`) VALUES (6, 'astralis', 1);
My query:
SELECT
m.matchid,
m.matchwinner Team,
CASE r.roundname
WHEN r.roundname = 'Final' THEN '1st'
ELSE '2'
END Place
FROM
matches m
JOIN rounds r ON m.roundid = r.roundid
WHERE
r.roundname = 'Final'
UNION SELECT
m.matchid,
m.matchwinner Team,
CASE r.roundname
WHEN r.roundname = '3rd place' THEN '3rd'
ELSE '4th'
END Place
FROM
matches m
JOIN rounds r ON m.roundid = r.roundid
WHERE
r.roundname = '3rd place';
I would like to know
- what places a particular team achieved (should probably use
HAVING m.matchwinner = 'fnatic'
)
MatchID – Team – Place
1 – fnatic – 1st
3 – fnatic – 3rd
4 – fnatic – 3rd
- what places all teams achieved
MatchID – Team – Place
1 – fnatic – 1st
2 – astralis – 1st
3 – fnatic – 3rd
4 – fnatic – 3rd
and so on
Don’t understand why my query isn’t working?
Advertisement
Answer
This looks like a join and conditional logic:
select
m.matchid,
m.matchwinner team,
case r.roundname
when 'Final' then '1st'
when '3rd place' then '3rd'
end place
from rounds r
inner join matches m on m.roundid = r.roundid
where m.matchwinner = 'fnatic'
order by m.matchid
To get the same result for all teams, just remove the where
clause.
matchid | team | place ------: | :----- | :---- 1 | fnatic | 1st 3 | fnatic | 3rd 4 | fnatic | 3rd