如何在join和union中使用case?

bfhwhh0e  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(341)

我有两张table:
比赛

CREATE TABLE rounds (
  `roundid` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `roundname` VARCHAR(45) NULL);

轮次

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);

插入

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);

我的问题:

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';

我想知道
某个特定团队取得了哪些成就(可能应该使用) HAVING m.matchwinner = 'fnatic' )
matchid-团队-地点
1-fnatic-1档
3-fnatic-3档
4-fnatic-3档
所有团队都取得了哪些成就
matchid-团队-地点
1-fnatic-1档
2-阿斯特里利斯-1
3-fnatic-3档
4-fnatic-3档
等等
不明白为什么我的查询不起作用?

c9x0cxw0

c9x0cxw01#

这看起来像一个连接和条件逻辑:

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

要对所有团队获得相同的结果,只需删除 where 条款。
db小提琴演示:

matchid | team   | place
------: | :----- | :----
      1 | fnatic | 1st  
      3 | fnatic | 3rd  
      4 | fnatic | 3rd

相关问题