mysql - 在 MySQL 的选择查询中使用 CASE、WHEN、THEN、END

标签 mysql select subquery case-when

我在一个与棒球相关的网站上工作。我有一张 table ,上面有两支棒球队的击球阵容:

+----+----------+--------------+--------+
| id | playerId | battingOrder | active |
+----+----------+--------------+--------+

击球顺序是1到20之间的整数,对应逻辑如下:

  1. 击球顺序 1-9 — 客队阵容
  2. 击球顺序 10 — 客队投手
  3. 击球顺序 11-19 — 主队阵容
  4. 击球顺序 20 — 主队投手

active 字段是一个 tinyint 0 或 1,代表投手在土墩上,击球手在本垒板上。

已知事实:始终会有一名来自一支球队的现役投手和一名来自另一支球队的现役击球手。

我需要编写一个查询,返回与 battingOrder 中的next 击球手对应的主队球员的行。 (在主动击球手的击球顺序之后发生的那个)

示例:

  1. 如果击球顺序为 13 的球员处于事件状态,则查询应返回击球顺序为 14 的球员。
  2. 如果 battingOrder 19 中的球员处于事件状态,则查询应返回击球顺序 11 中的球员(阵容循环回到球队的第一名球员)。

我以前从未使用过 CASE 查询,但我想到了以下内容:

SELECT *
  FROM lineups
 WHERE battingOrder = 
       CASE (
           SELECT battingOrder
             FROM lineups
            WHERE battingOrder > 10 AND active = 1
            LIMIT 1
       )
       WHEN 11 THEN 12
       WHEN 12 THEN 13
       WHEN 13 THEN 14
       WHEN 14 THEN 15
       WHEN 15 THEN 16
       WHEN 16 THEN 17
       WHEN 17 THEN 18
       WHEN 18 THEN 19
       WHEN 19 THEN 11
       END
 LIMIT 1;

这似乎可行,但我遇到了哪些极端情况和/或陷阱?这有效率吗?我对不使用嵌套查询的问题的解决方案特别感兴趣。

最佳答案

Select LNext.player As NextPlayer
From lineups As L
    Left Join lineups As LNext
        On LNext.BattingOrder Between 11 And 20
            And LNext.BattingOrder  = Case
                                        When L.BattingOrder  = 19 Then 11
                                        Else L.BattingOrder  + 1
                                        End
Where L.battingOrder Between 11 And 20
    And L.active = 1

事实上,您可以像这样让它同时处理主场和客场:

Select LNext.player As NextPlayer
From lineups As L
    Left Join lineups As LNext
        On LNext.BattingOrder  = Case
                                    When L.BattingOrder  = 19 Then 11
                                    When L.BattingOrder  = 9 Then 1
                                    Else L.BattingOrder  + 1
                                    End
Where L.active = 1

关于mysql - 在 MySQL 的选择查询中使用 CASE、WHEN、THEN、END,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5656440/

相关文章:

mysql group 有 min

mysql - Django 外键约束

sql - 同时实现二进制和排序规则的属性

mysql - 如何在子查询返回多行的情况下执行子查询?

sql - BigQuery SQL 错误 : Name rank not found inside latest at [9:15]

java - 只读多表 DTO + Hibernate

php - 删除后显示一行的值

mysql - 显示带有限制的最后 x 行查询

javascript - Vue 使用 v-model 选择第一个选项

sql - 获取sql查询中的百分比