Есть ли более простой способ выяснить запрос - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть таблица фильмов, в которой есть год и детали фильма, такие как название, идентификатор фильма (в середине) и таблица m_cast, где у меня есть все актеры в этом фильме.

Я хотел бы получить всех актеров, которые никогда не были безработными более 3 лет.(Предполагается, что актеры не работают между двумя последовательными фильмами)

Я придумал код, который

select a.yr1 y1 ,  b.yr2 y2 , a.yr1 - b.yr2 diff from 
(select substr(substr(trim(year),-5),0,5) yr1 , * from movie m inner join m_cast p on m.mid = p.mid order by pid , yr1) a ,
(select substr(substr(trim(year),-5),0,5) yr2 , * from movie m inner join m_cast p on m.mid = p.mid order by pid, yr2) b on a.yr1 > b.yr2
where not exists 
(select count(*) from movie m inner join m_cast p on m.mid = p.mid
and cast(substr(substr(trim(year),-5),0,5) as integer) < a.yr1 and cast(substr(substr(trim(year),-5),0,5) as integer) > b.yr2)

Самостоятельное объединение занимает много времени.И функции отставания и опережения не работают в версии SQLite, которую я использую.

1 Ответ

0 голосов
/ 04 февраля 2019

Я предполагаю, что в таблице фильмов есть столбец с именем year и столбец, в котором указывается имя актера.Примерно так: year int, actorId int

Самый быстрый способ выполнить ваш запрос - это отфильтровать последние 3 года из таблицы фильмов, а затем сгруппировать по вашим актерам различное количество лет.

Пример после фильтрации ActorId Год 1. 2018 1. 2018 1. 2017 2. 2016 2. 2017 2. 2018

Затем сгруппируйте и выберите отличительные: Выберите actorId из группы movieTable по actorId, имеяcount (Different (Year)) = 3

И это вернет только тех актеров, которые работали в последние 3 года.Как только вы отфильтруете свои идентификаторы актеров в этом столбце, сделайте соединение с таблицей, в которой хранятся их имена.

Извините за формат моего письма - сделал это со своего мобильного телефона.

С уважением,Хорхе Д. Лопес

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