问题描述
第一个查询q1给出期望的结果。 但是查询q2对于一对演员和导演来说,没有太多的电影。
SELECT * FROM
(SELECT pc.PID AS actorID,pc.Name AS Actor,pd.PID AS directorID,pd.Name AS
Director,COUNT(disTINCT m.MID) count_movie FROM Movie m
JOIN
M_Cast mc ON m.MID = Trim(mc.MID)
JOIN
M_Director md ON m.MID = md.MID
JOIN
Person pc ON Trim(mc.PID) = pc.PID
JOIN
Person pd ON md.PID = pd.PID
WHERE pd.Name LIKE '%Yash%' GROUP BY pc.Name) AS q1
JOIN
(SELECT pc.PID AS actorID,pc.Name Actor,pd.Name AS Director,COUNT(disTINCT
m.MID) count_movie FROM Movie m
JOIN
M_Cast mc ON m.MID = TRIM(mc.MID )
JOIN
M_Director md ON m.MID = md.MID
JOIN
Person pc ON TRIM(mc.PID) = pc.PID
JOIN
Person pd ON md.PID = pd.PID
WHERE pd.Name NOT LIKE '%Yash%' GROUP BY pc.PID) AS q2
ON q1.Actor = q2.Actor ORDER BY q1.count_movie DESC
actorID Actor directorID Director count_movie actorID Actor directorID Director count_movie
0 nm0707271 Jagdish Raj nm0007181 Yash Chopra 11 nm0707271 Jagdish Raj nm0474806 Gulshan Kumar 98
1 nm0471443 Manmohan nm0007181 Yash Chopra 10 nm0471443 Manmohan nm0695153 T. Prakash Rao 39
2 nm0407002 Iftekhar nm0007181 Yash Chopra 9 nm0407002 Iftekhar nm1065099 C.P. Dixit 93
3 nm0534501 Madan Puri nm0007181 Yash Chopra 8 nm0534501 Madan Puri nm0619050 Hiren Nag 94
最右边的movie_count似乎过高。如果必须与答案匹配,则第一行的值应小于11。
在这里,我没有使用上面的WHERE条件只是为了显示我的查询错误。 即使我使用Where条件
where q1.count_movie > q2.count_movie
我得到的结果是
Name count
0 Sanjeev Kumar 3
1 Sanjeev Kumar 3
2 Sanjeev Kumar 3
3 Sanjeev Kumar 3
4 Ashok Kumar 2
Name count
0 Jagdish Raj 11
1 Manmohan 10
2 Iftekhar 9
3 Shashi Kapoor 7
4 Rakhee Gulzar 5
5 Waheeda Rehman 5
给出的表是
- 电影(MID,标题,年份)
- M_Cast(MID,PID)
- 人员(PID,姓名,性别)
- M_Director(MID,PID)
我是sql的新手,调试代码时遇到很多麻烦。 请帮助我理解逻辑。
解决方法
查询第二部分的问题是您对所有其他导演的所有电影进行汇总,而不是对每个导演的电影进行计数。
我看到该任务的两种方法:
- 每个演员都将Yash Chopra的电影数量与其他所有对象进行比较。 (这将需要
WHERE yash_chopra_count > ANY (...)
,但是SQLite不使用ANY
关键字。)或者将Yash Chopra的电影计数与其他电影的最大计数进行比较。 (在SQLite中确实可以使用。) - 按电影数量划分每个演员的导演,查看排名最高的演员是否是Yash Chopra。 (应该使用
ROW_COUNT
完成)。
在开始之前,让我们检查一下是否一切正确:数据模型允许每个电影有多个导演。但是我们仍然可以数数。如果演员与Yash Chopra一起拍了三部电影,而与I. S. Johar一起拍了三部电影,那么我们不在乎这些电影是六部独立的电影,还是Yash Chopra担任I. S. Johar的助理导演时只拍了三部电影。在我的演员示例中,我们看到另一位导演的电影至少与Yash Chopra的导演数量相同,因此我们不想选择该演员。因此,m:n关系没有障碍。没关系。
现在,我们确保可以简单地计算每个演员和导演的电影,让我们看看两种方法:
比较Yash Chopra计数和其他最大计数
如前所述,由于SQLite缺少ANY
运算符,因此我们必须两次汇总其他控制器(一次为每个控制器计数,一次为最大计数)。不过,当我们使用CTE来提高可读性时,这没什么大不了的。
with director_actor as
(
select
c.pid as pid_actor,d.pid as pid_director,count(*) as movie_count
from m_director d
join m_cast c on c.mid = d.mid
group by c.pid,d.pid
)
select pid_actor,movie_count
from director_actor
where pid_director = (select pid from person where name = 'Yash Chopra')
and movie_count >
(
select coalesce(max(movie_count),0)
from director_actor other
where other.pid_actor = director_actor.pid_actor
and other.pid_director <> director_actor.pid_director
);
每个演员的电影导演排名
我们必须采取什么步骤来使演员受到质疑?
- 计算每个演员和导演的电影。
- 每个演员的导演排名。电影最多的导演排名第一。如果有平局,那么我们对另一位导演的排名要比对Yash Chopra更好,因此,如果Yash Chopra的电影比其他导演多,则Yash Chopra只能排在第一位。
- 让演员中排名最高的导演是Yash Chopra。
对于排名,我将使用ROW_NUMBER
。
with ranked as
(
select
c.pid as pid_actor,yc.pid as pid_yash_chopra,count(*) as movie_count,row_number() over (partition by c.pid order by count(*) desc,d.pid = yc.pid) as rn
from m_director d
join m_cast c on c.mid = d.mid
left join person yc on yc.pid = d.pid and name = 'Yash Chopra'
group by c.pid,d.pid,yc.pid
)
select pid_actor,movie_count
from ranked
where rn = 1 and pid_director = pid_yash_chopra;