mysql - 包含 3 个表的复杂 IF 语句

标签 mysql relational-database relational

这是 this question from yesterday 的延续。

这是我的三个表格:

战士表

fighter_id |  name
-----------------------
1          | John
2          | Steve
3          | Bill
4          | Bobby

事件表

event_id  |  event_name  |  event_date
-------------------------------------------
1          | MMA         |  01/01/2010
2          | Cool        |  02/20/2010
3          | Yeaa!       |  04/15/2010

战斗表

fight_id  |  fighter_a  |  fighter_b  |  winner  |  method  |  event
-----------------------------------------------------------------------
1         | 1           |  2          |  1       | Sub      | 1
2         | 4           |  1          |  4       | KO       | 2
3         | 1           |  3          |  NULL    | Draw     | 3

尝试获取结果

result  |  opponent  |  method  |  event  |  date        
----------------------------------------------------------
Draw    | Bill       |  Draw    |  Yeaa!  |  04/15/2010  
Loss    | Bobby      |  KO      |  Cool   |  02/20/2010 
Win     | Steve      |  Sub     |  MMA    |  01/01/2010

因此,在 Fights 表中,fighter_a、fighter_b 和 winner 是与 Fighters 表中的fighter_id 对应的整数。

我基本上是在一个基于fighter_id ($fighter_id) 检索数据的页面上。

我试图为该战士的每场战斗创建行,其中包括对手的姓名、结果(获胜、失败、平局或 NC)、方法、事件名称和事件日期。挑战在于,获胜者可以是战斗机_a 或战斗机_b。它并不总是在同一列中。我很感激我能得到的任何帮助。

select 
    fight_id,
    CASE
      WHEN winner is not null and winner=fighter_id then 'win'
      WHEN winner is not null and winner<>fighter_id then 'loss'
      WHEN winner is null and method='Draw' then 'draw'
      WHEN winner is null and method = 'No Contest' then 'no contest'
      ELSE ''
    END as match_result,
    participant.name 'participant',
    opponent.name 'opponent'
FROM fights
    INNER JOIN fighters as participant on participant.fighter_id = fights.fighter_a
    INNER JOIN fighters as oppoent on opponent.fighter_id = fights.fighter_b
WHERE 
    fighter_a=$fighter_id OR fighter_b=$fighter_id
ORDER BY
    event_date DESC

最佳答案

使用带有条件的子选择将要查找的fighter_id切换到column_a(如果它在column_b中),这样就简化了外部查询中的操作和连接:

SELECT
    (
        CASE
            WHEN a.winner = a.f_a THEN 'Win'
            WHEN a.winner = a.f_b THEN 'Loss'
            WHEN a.winner IS NULL THEN a.method
        END
    ) AS result,
    b.name AS opponent,
    a.method AS method,
    c.event_name AS event,
    c.event_date AS date
FROM
    (
        SELECT 
            IF(fighter_b = $fighter_id, fighter_b, fighter_a) AS f_a,
            IF(fighter_b = $fighter_id, fighter_a, fighter_b) AS f_b,
            winner,
            method,
            event
        FROM 
            fights
        WHERE
            $fighter_id IN (fighter_a, fighter_b)
    ) a
INNER JOIN
    fighters b ON a.f_b = b.fighter_id
INNER JOIN
    events c ON a.event = c.event_id
ORDER BY
    c.event_date DESC

此外,如果获胜者字段为空,则仅回显方法字段。这样,当您想要向系统添加另一种类型的方法(其中 winner 为 null)时,您不必继续在 CASE 语句中添加更多条件检查。

关于mysql - 包含 3 个表的复杂 IF 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11006025/

相关文章:

sql - 表中主键的最佳做法是什么?

database - 使用对象角色建模 (ORM) 的关系模型中的动态类型

database - 关系数据库建模的正确方法

database - ReadCommitted 隔离级别

mysql - 选择至少具有功能列表的所有行

sql - 查询根据其他字段用最大值填充Null字段

php - 成员(member)搜索功能

php - 如何在mysql View 表中将行显示为列

php - 使用 MySQL 用户通过 php 登录 - 为什么不呢?

使用数组和 IN 语句的 PHP MySQL UPDATE 查询