假设所有matches
的状态都设置为MAX
,或者matches
的{{ 1}}游戏周我该怎么做?
数据样本
3
最终结果应为:matches
,因为并非所有比赛都进行了。
我能够为MIN
设置查询:
id | status | gameweek | round_id
1 3 3 1
2 3 3 1
3 1 3 1
4 1 4 1
5 1 4 1
6 1 4 1
但是我很难实现IF条件,有人可以帮助我吗?
谢谢。
更新
在用户提出的解决方案中,我注意到我无法很好地解释特定情况:如果某回合的所有比赛都不具有状态3,则查询应返回round_id的MIN(游戏周)指定。
答案 0 :(得分:2)
如果我做对了,您可以使用CASE
。如果存在status
以外的3
记录,则返回最小值gameweek
,否则返回最大值。将结果与gameweek
进行比较。
SELECT `m1`.*
FROM `match` `m1`
WHERE `m1`.`round_id` = 1
AND `m1`.`gameweek` = CASE
WHEN EXISTS (SELECT *
FROM `match` `m2`
WHERE `m2`.`round_id` = `m1`.`round_id`
AND `m2`.`status` <> 3) THEN
(SELECT min(`m3`.`gameweek`)
FROM `match` `m3`
WHERE `m3`.`round_id` = `m1`.`round_id`)
ELSE
(SELECT max(`m4`.`gameweek`)
FROM `match` `m4`
WHERE `m4`.`round_id` = `m1`.`round_id`)
END;
我不确定您是否要将其限制为某个round_id
。它在您的查询中,但不在文本中。如果不需要,请删除与round_id
相关的所有条件。
编辑:
要使用最大的gameweek
(如果不是所有status
等于3,最小的gameweek
等于3),则可以检查status
的最小值是否等于最大值(即所有状态都相同),并且等于3。
SELECT `m1`.*
FROM `match` `m1`
WHERE `m1`.`round_id` = 1
AND `m1`.`gameweek` = CASE
WHEN EXISTS (SELECT min(`m2`.`status`)
FROM `match` `m2`
WHERE `m2`.`round_id` = `m1`.`round_id`
HAVING min(`m2`.`status`) <> max(`m2`.`status`)
OR min(`m2`.`status`) <> 3) THEN
(SELECT min(`m3`.`gameweek`)
FROM `match` `m3`
WHERE `m3`.`round_id` = `m1`.`round_id`)
ELSE
(SELECT max(`m4`.`gameweek`)
FROM `match` `m4`
WHERE `m4`.`round_id` = `m1`.`round_id`)
END;
答案 1 :(得分:1)
假设可以有多个round_id
:
SELECT *
FROM `match` m
WHERE (gameweek, round_id ) =
(
SELECT MAX(gameweek),round_id
FROM `match` m
WHERE round_id = 1 AND m.status = 3
GROUP BY round_id
)
答案 2 :(得分:0)
好吧,比我想像的要简单,我发现可以使用COALESCE
运算符来实现此目标,所以:
m.gameweek = (SELECT COALESCE(MIN(
CASE WHEN m2.status < 3
THEN m2.gameweek END),
MAX(m2.gameweek))
FROM `match` m2
WHERE m2.round_id = m.round_id)