如何在查询中使用if条件?

时间:2018-07-23 10:15:10

标签: mysql sql

假设所有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(游戏周)指定。

3 个答案:

答案 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
)

DBFiddle DEMO

答案 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)
相关问题