Поиск по индексу SQL - PullRequest
       32

Поиск по индексу SQL

0 голосов
/ 07 марта 2012

Для этой задачи я должен найти все имена актеров, которые участвовали в более чем 50 фильмах. В каждом фильме я должен проверить, что их фамилия стоит на первом месте в алфавите вместе с другими актерами в фильме.

select 
     lastname, firstname, count(*) as films
from 
     (select 
           distinct p.lastname, p.firstname, f.filmid
      from 
           person p, filmparticipation f, filmitem i, film fi
      where 
           fi.filmid = i.filmid and
           i.filmid = f.filmid and
           p.personid = f.personid and
           f.parttype = 'cast' and filmtype = 'C') person
 group by 
     lastname, firstname
 having 
     count(*) >= 450
 order by 
     lastname, firstname desc;

Вот несколько соответствующих таблиц, касающихся запроса

create table person(
personid int primary key,
lastname text not null,
firstname text not null,
gender(1),
);
create index personlastnameindex on person (lastname);

create table filmparticipation (
partid int primary key,
personid int not null references person (personid),
filmid int not null references filmitem (filmid),
parttype text not null
);

create index filmparticipationpersonidindex on filmparticipation (personid);
create index filmparticipationpersonidindex on filmparticipation (filmid);

create table film(
filmid int primary key references filmitem (filmid),
title text not null,
prodyear int
);

create index filmtitleindex on film (title);
create index filmyearindex on film (prodyear);

Некоторые пояснения относительно некоторых типов фильмов =>

 C => cinema movie V => videomovie VG => videogame TV => TV-film.....

Как мне на самом деле заставить его проверить, что человек идет первым в алфавите против других актеров?

Пример => Художественная фантастика ... (есть несколько других актеров, но они принимают главные роли) Сэмюэл Л. Джексон || Джон Траволта Легко понять, что Джексон идет перед Траволтой, так что +1 для Джексона и т. Д. ...

Я видел псевдокод, который выглядит как min (p.lastname в этом фильме) или p.lastname <= all (p.lastname в фильме) </p>

Как я могу использовать любой из них? Или это лучше?

1 Ответ

0 голосов
/ 07 марта 2012

Предполагается, что вы используете СУРБД, включающую row_number (), попробуйте:

select lastname, 
       firstname, 
       count(distinct filmid) as films,
       count(distinct case when rn=1 then filmid end) as alpha_first
from 
(select p.lastname,
        p.firstname,
        f.filmid,
        row_number() over (partition by f.filmid order by lastname, firstname) rn
 from person p, filmparticipation f, filmitem i, film fi
 where fi.filmid = i.filmid and
       i.filmid = f.filmid and
       p.personid = f.personid and
       f.parttype = 'cast' and filmtype = 'C') person
group by lastname, firstname
having count(distinct filmid) >= 50
order by lastname, firstname desc;
...