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

标签 mysql sql

如果所有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/

相关文章:

android - 在现有 SQLITE 中创建附加表(无数据丢失)

PHP + MySQL 查询 -> 这个 SQL 有什么问题(短)

mysql : Match Against query

mysql - 为什么仅使用索引不能解决这个结果?

具有多个 SET 和 WHERE 的 SQL 语句

c# - 具有多个标签的唯一结果的搜索算法

c# - 使用 LINQ 在 C# 中计算记录

php - 将一个表中的列与另一个表中的列进行匹配

mysql - 没有周末的日期倒退

where 子句中的 Mysql 条件未正确报告