mysql - 如何根据返回值执行不同的查询?

标签 mysql sql

我有一个定义如下的足球比赛列表:

id |        datetime      | status | gameweek | round_id | home_team_id
 1   2019-03-31 00:00:00      1          29     12696          1243
 2   2019-03-31 00:00:00      1          29     12696          1248
 3   2019-03-31 00:00:00      1          29     12696          1242
 4   2019-03-31 00:00:00      1          29     12696          1246
 5   2019-03-31 00:00:00      1          29     12696          1244
 6   2019-03-31 00:00:00      1          29     12696          1247
 7   2019-03-31 20:30:00      1          29     12696          1241
 8   2019-03-31 00:00:00      1          29     12696          1249
 9   2019-03-31 00:00:00      1          29     12696          2981
 10  2019-03-31 00:00:00      1          29     12696          1259

我需要将下一个 gameweek 作为 gameweek 的所有 matches 返回到完成的 matches 而不是全部。

一些 rounds 没有任何 gameweek,所以在这种情况下应该返回所有具有 datetime 的 matches 在完成的 match 旁边。

我写的查询是这样的:

Select m.* from `match` m where round_id = 12696 and m.datetime = (SELECT COALESCE(MIN(CASE WHEN m2.status < 5 THEN m2.datetime END), MAX(m2.datetime)) FROM `match` m2 WHERE m2.round_id = m.round_id)

这只返回9条记录,我不明白为什么,唯一的原因是一条记录也有时间。

完成的匹配是什么意思?

对于 matches ended 或 finished 我的意思是每个 match 的状态是 531 的状态表示 match 已安排,但尚未播放; 5 表示完成3 取消。

例如:

id |        datetime      | status | gameweek | round_id | home_team_id
 1   2019-03-20 00:00:00      5          29     12696          1243
 2   2019-03-20 00:00:00      5          29     12696          1248
 3   2019-03-20 00:00:00      5          29     12696          1242
 4   2019-03-31 00:00:00      1          29     12696          1246
 5   2019-03-31 00:00:00      1          29     12696          1244
 6   2019-03-31 00:00:00      1          29     12696          1247
 7   2019-03-31 20:30:00      1          29     12696          1241
 8   2019-03-31 00:00:00      1          29     12696          1249
 9   2019-03-31 00:00:00      1          29     12696          2981
 10  2019-03-31 00:00:00      1          29     12696          1259

如您所见,前三张唱片已经播放。在这种情况下,查询需要返回所有的比赛(已参加和安排的比赛),因为 gameweek 29 还包含其他未参加的比赛然而,所以预期的结果是所有 10 条记录。

预期结果:1、2、3、4、5、6、7、8、9、10

另一个重要的事情是一些round没有任何gameweek,所以假设这样,我们需要返回即将到来的比赛,例如:

id |        datetime      | status | gameweek | round_id | home_team_id
 1   2019-03-20 00:00:00      5        NULL     12696          1243
 2   2019-03-20 00:00:00      5        NULL     12696          1248
 3   2019-03-20 00:00:00      5        NULL     12696          1242
 4   2019-03-31 00:00:00      1        NULL     12696          1246
 5   2019-03-31 00:00:00      1        NULL     12696          1244
 6   2019-03-31 00:00:00      1        NULL     12696          1247
 7   2019-03-31 20:30:00      1        NULL     12696          1241
 8   2019-03-31 00:00:00      1        NULL     12696          1249
 9   2019-03-31 00:00:00      1        NULL     12696          2981
 10  2019-03-31 00:00:00      1        NULL     12696          1259

预期结果:4、5、6、7、8、9、10

(在 fiddle 中,记录 7 丢失了)。

如果没有gameweeks,但是所有的matches都结束了(状态5),那么我们需要返回所有的matches最新的datetime,例如:

id |        datetime      | status | gameweek | round_id | home_team_id
 1   2019-03-20 00:00:00      5        NULL     12696          1243
 2   2019-03-20 00:00:00      5        NULL     12696          1248
 3   2019-03-20 00:00:00      5        NULL     12696          1242
 4   2019-03-31 00:00:00      5        NULL     12696          1246
 5   2019-03-31 00:00:00      5        NULL     12696          1244
 6   2019-03-31 00:00:00      5        NULL     12696          1247
 7   2019-03-31 20:30:00      5        NULL     12696          1241
 8   2019-03-31 00:00:00      5        NULL     12696          1249
 9   2019-04-05 00:00:00      5        NULL     12696          2981
 10  2019-04-05 00:00:00      5        NULL     12696          1259

预期结果:9、10

id |        datetime      | status | gameweek | round_id | home_team_id
 1   2019-03-20 00:00:00      5        28     12696          1243
 2   2019-03-20 00:00:00      5        28     12696          1248
 3   2019-03-20 00:00:00      1        28     12696          1242
 4   2019-03-31 00:00:00      1        28     12696          1246
 5   2019-04-05 00:00:00      5        29     12696          1244
 6   2019-04-05 00:00:00      5        29     12696          1247
 7   2019-04-05 20:30:00      5        29     12696          1241
 8   2019-04-05 00:00:00      5        29     12696          1249

预期结果: 1,2,3,4,

我创建了一个 fiddle这里涵盖了所有案例。

最佳答案

这感觉像是一个不必要的复杂查询,但它确实符合上述输出。可能是一个很好的起点。

with current_round as (
    select * 
    from match_case_1
    where round_id = 12696
)
select *
from current_round cr
where
    (
        not exists(select * from current_round where gameweek is null)
    )
    or 
    (
        exists(select * from current_round where status = 1) 
        and not exists(select * from current_round where gameweek is not null)
        and cr.status = 1    
    )
    or 
    (
        not exists(select * from current_round where status = 1)
        and not exists(select * from current_round where gameweek is not null)
        and cast(cr.`datetime` as date) = (
            select max(cast(`datetime` as date)) as `date`
            from current_round
            where status = 5 or status = 3
        )
    );

编辑

发布场景的 DB Fiddle 查询

  1. https://www.db-fiddle.com/f/2f7NEPo72tUM7zLHBX2GXQ/0
  2. https://www.db-fiddle.com/f/3ghG6zf7hv2SbACL9vtnJa/1
  3. https://www.db-fiddle.com/f/q7DgtJRfDxyPA8bQheRncA/1
  4. https://www.db-fiddle.com/f/tV7VhZg1Ywfx1YmnFMtZdh/1

关于mysql - 如何根据返回值执行不同的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55247116/

相关文章:

php - 如何更新 Laravel 5.1 中用户表中的值

mysql - 我怎样才能提高嵌套的 mysql 查询速度,比如这个?

mysql - 如何将示例数据表拆分为BCNF/4NF?

c# - Oracle.DataAccess.Client.OracleException 在 Connection.Open()

SQL根据一个字段的值在两个字段之间进行选择

php - 使用 > 符号拆分关联数组并将其显示在列表 ion php 中

php - Laravel 根据另一个字段从表中选择随机行

mysql - 计算一个选择中除以条件的行数

mysql - ./configure 在树莓派 3 上找不到 libmysqlclient 库,无法链接

php - SQL左连接数组部分为空