Выбор выхода из двух таблиц БД в один выход - PullRequest
0 голосов
/ 30 октября 2019

У меня есть две таблицы: операторы (кто управляет самолетом) и история (история - это движение самолета). Что мне нужно сделать, это только показать операторы, которые имеют «активный» флаг в таблице истории в качестве последней записи. Например, у меня в таблице истории 10 записей для самолета в таблице истории. последняя запись для этого - для British Airways, и самолет активен. следовательно, это должно позволить British Airways быть указанным в выходных данных. Затем у меня есть 10 заявок на самолет, который был с Fly Uk, а затем был продан British Airways. Оба самолета имели или имеют активный самолет, но, поскольку British Airways является действующим оператором самолета, он не должен показывать FLY UK в этом списке. Оба оператора могут иметь несколько самолетов в списке, некоторые из которых активны, а некоторые - по порядку, сохранены и т. Д. Таблицы -

История имеет поле для оператора и статуса (где это может быть активно, сохранено, удалено,списано)

У самолета есть поле для OperatorName

, поэтому должно быть что-то вроде

select * 
from operators 
where max history.status = 'active' or 'stored' or 'grounded';

, однако оно не работает?

У меня естьпробовал разные вещи с кодом, изменил версию PHP и не лучше в ситуации

select * 
from operators 
where max history.status = 'active' or 'stored' or 'grounded';

Я не получаю вывод с этим

1 Ответ

2 голосов
/ 30 октября 2019

Вы можете использовать коррелированный подзапрос:

select o.*
from operators o
where (
    select h.status
    from history h
    where h.operatorName = o.operatorName
    order by h.operationDate desc
    limit 1
) in ('active', 'stored', 'grounded')

В MySQL 8.0 полезны оконные функции:

select *
from (
    select 
        o.*, 
        h.status,
        rank() over(partition by h.operatorName order by h.operationDate desc) rn
    from operators
    inner join history h on h.operatorName = o.operatorName
) t
where 
    rn = 1 
    and status in ('active', 'stored', 'grounded')

history.status = 'active' or 'stored' or 'grounded' не будет работать, как вы ожидаете,Это всегда будет true.

На самом деле существует 3 условных утверждения:
history.status = 'active'
'stored'
'grounded'

'stored' и'grounded' не будет никогда быть ложным, поскольку непустая строка не считается ложной

Ваше условие может быть переписано таким образом, и логика сохраняется: (history.status = 'active') or (TRUE) or (TRUE), что оценивается как TRUE независимо от значения history.status

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...