这是 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/