复杂 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
我的数据库是这样创建的:
我想 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