Расчетный MySQL результат - PullRequest
1 голос
/ 15 февраля 2020

У меня есть база данных бойцов ММА и их боев, хранящихся в двух таблицах: боец ​​ и бой .

Я хочу запросить базу данных с заданным получить идентификатор и получить результат в таких строках:

Result | Record | Weight| Opponent| Opponent Record | Opponent Weight | Method | Date | Round | Time

4 последних столбца довольно просты, но остальные столбцы хитрые, так как я не знаю, является ли данный идентификатор истребителя fighter1 или fighter2 :

Результат должен быть взят из fight.winner , который имеет значения "fighter1", "fighter2", "TBD", "D" или "N C». Результат должен быть рассчитан на основе того, является ли данный идентификатор истребителя fighter1 или fighter2, поэтому он показывает либо «W», «L», «TBD», «D» или «N C».

Запись и Запись противника должна быть взята из fight.fighter1_record_after_result или fight.fighter2_record_after_result , в зависимости от того, является ли данный идентификатор бойца fighter1 или боец2.

вес и вес противника следует брать из fight.fighter1_weight или fight.fighter2_weight , в зависимости от если данный идентификатор истребителя равен fighter1 или fighter2.

Противник должен быть взят из fighter.name . Кого следует считать противником, зависит от того, является ли данный идентификатор бойца fighter1 или fighter2.

Структура данных и пример данных в DB Fiddle: https://www.db-fiddle.com/f/5LjJqEM6yMYuShZybcsrJ5/0

1 Ответ

1 голос
/ 15 февраля 2020

union all может пригодиться: вместо того, чтобы реализовывать сложные условные логики c в одном запросе, мы можем объединить результирующие наборы двух запросов, которые ищут истребитель targer в столбце fighter1 или столбце fighter2:

select
    case t.winner
        when 'fighter1' then 'W'
        when 'fighter2' then 'L'
        else t.winner
    end result,
    t.fighter1_record_after_result record,
    t.fighter1_weight weight,
    r.name opponent,
    t.fighter2_record_after_result oppononed_record,
    t.fighter2_weight opponent_weight,
    t.method,
    t.date,
    t.round,
    t.time
from fight t
left join fighter r on r.id = t.fighter2
where t.fighter1 = 64
union all
select
    case t.winner
        when 'fighter2' then 'W'
        when 'fighter1' then 'L'
        else t.winner
    end,
    t.fighter2_record_after_result,
    t.fighter2_weight,
    r.name,
    t.fighter1_record_after_result,
    t.fighter1_weight,
    t.method,
    t.date,
    t.round,
    t.time
from fight t
left join fighter r on r.id = t.fighter1
where t.fighter2 = 64

Оба параметра должны иметь значение бойца, для которого вы генерируете отчет.

...