如果将所有matches的状态都设置为MAX,或者我想在matches游戏周中选择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


最终结果应为: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等于3,最小的status要使用最大的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;

10-06 00:42