复杂 sql 查询多对多

complex sql query many to many

我的数据库是这样创建的:

我想 select 同一个人的人名和电影名充当 "Oyuncu" 和 "Senarist"

请帮帮我。我写了一个这样的查询;

select 
    MovieName,PersonName,RoleName 
from 
    Movies,
    MoviesPersonRole,
    PersonRole,
    Person,
    Role
where 
    Movies.Id = MoviesPersonRole.MovieId 
    and 
    PersonRole.Id = MoviesPersonRole.PersonRoleId 
    and 
    PersonRole.RoleId = Role.Id 
    and 
    PersonRole.PersonId = Person.Id

结果是

MovieName         PersonName    RoleName
Pulp Fiction       Mehmet        Oyuncu
Pulp Fiction       Mehmet        Senarist
Matrix             Aylin         Oyuncu
LOTR               Gökberk       Oyuncu
LOTR               Gökberk       Senarist
Pulp Fiction       Aylin         Oyuncu

将此行添加到您的查询中

and Role.RoleName in('Oyuncu' ,'Senarist')

第二个 Join on Role 应该可以做到:

SELECT  MovieName ,
        PersonName ,
        RoleName
FROM    Movies
        JOIN MoviesPersonRole ON Movies.Id = MoviesPersonRole.MovieId
        JOIN PersonRole ON PersonRole.Id = MoviesPersonRole.PersonRoleId
        JOIN Person ON PersonRole.PersonId = Person.Id
        JOIN Role Role1 ON PersonRole.RoleId = Role1.Id
        JOIN Role Role2 ON PersonRole.RoleId = Role2.Id
WHERE   Role1.RoleName = 'Oyuncu'
        AND Role2.RoleName = 'Senarist'

尝试以下查询:

SELECT  MovieName ,
        PersonName ,
        RoleName
FROM    Movies,
        MoviesPersonRole,
        PersonRole,
        Person,
        Role
WHERE   Role1.RoleName = 'Oyuncu'
        AND Role2.RoleName = 'Senarist'
        AND Movies.Id = MoviesPersonRole.MovieId 
        AND PersonRole.Id = MoviesPersonRole.PersonRoleId 
        AND PersonRole.RoleId = Role.Id 
        AND PersonRole.PersonId = Person.Id

您可以尝试这样的操作:

SELECT X.MovieName, X.PersonName FROM (
  SELECT M.MovieName, PE.PersonName, COUNT(*) AS RoleCount
    FROM Movies M
    INNER JOIN MoviesPersonRole MPR ON (MPR.MovieId=M.Id)
    INNER JOIN PersonRole PR ON (PR.Id = MPR.PersonRoleId)
    INNER JOIN Person PE ON (PE.Id = PR.PersonId)
    INNER JOIN Role R ON (R.Id = PR.RoleId)
    WHERE R.RoleName='Oyuncu' OR R.RoleName='Senarist' 
    GROUP BY M.MovieName, PE.PersonName
  ) X WHERE X.RoleCount>1