如果所有matches
的状态都设置为3
,假设我想选择MAX
gameweek 的matches
>,或 匹配
与 MIN
gameweek 我该怎么做?
数据样本
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
最后的结果应该是:1, 2, 3
因为不是所有的比赛都打完了。
我能够为 MAX
设置查询:
SELECT MAX(gameweek) FROM `match` m WHERE round_id = 1 AND m.status = 3
但是我有一些难以实现的 IF 条件,有人可以帮助我吗?
谢谢。
更新
在用户提出的解决方案中,我注意到我没有很好地解释特定情况:如果一轮的所有比赛都没有状态 3,则查询应返回 round_id 的 MIN(gameweek)指定。
最佳答案
如果我做对了,您可以使用 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
否则你可以检查是否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;
关于mysql - 如何在查询中使用 if 条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51476388/