使用IMDB数据集查找使用Yash Chopra制作的电影多于其他导演的所有演员转贴

问题描述

一个查询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

以下输出是正确的结果。 它将给出245行。我只显示6行。

                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的新手,调试代码时遇到很多麻烦。 请帮助我理解逻辑。

解决方法

查询第二部分的问题是您对所有其他导演的所有电影进行汇总,而不是对每个导演的电影进行计数。

我看到该任务的两种方法:

  1. 每个演员都将Yash Chopra的电影数量与其他所有对象进行比较。 (这将需要 WHERE yash_chopra_count > ANY (...),但是SQLite不使用ANY关键字。)或者将Yash Chopra的电影计数与其他电影的最大计数进行比较。 (在SQLite中确实可以使用。)
  2. 按电影数量划分每个演员的导演,查看排名最高的演员是否是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
);

每个演员的电影导演排名

我们必须采取什么步骤来使演员受到质疑?

  1. 计算每个演员和导演的电影。
  2. 每个演员的导演排名。电影最多的导演排名第一。如果有平局,那么我们对另一位导演的排名要比对Yash Chopra更好,因此,如果Yash Chopra的电影比其他导演多,则Yash Chopra只能排在第一位。
  3. 让演员中排名最高的导演是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;

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...