【问题标题】:Find all the actors that made more movies with Yash Chopra than any other director找出所有与 Yash Chopra 合作的电影比任何其他导演都多的演员
【发布时间】:2022-01-13 13:29:07
【问题描述】:

Scehma

    SELECT   p1.pid, 
         p1.NAME, 
         Count(movie.mid) AS movieswithyc 
FROM     person           AS p1 natural 
JOIN     m_cast natural 
JOIN     movie 
JOIN     m_director 
ON       ( 
                  movie.mid = m_director.mid) 
JOIN     person AS p2 
ON       ( 
                  m_director.pid = p2.pid) 
WHERE    p2.NAME LIKE 'Yash Chopra' 
GROUP BY p1.pid 
HAVING   Count(movie.mid) >ALL 
         ( 
                    SELECT     Count(movie.mid) 
                    FROM       person AS p3 natural 
                    JOIN       m_cast 
                    INNER JOIN movie 
                    JOIN       m_director 
                    ON         ( 
                                          movie.mid = m_director.mid) 
                    JOIN       person AS p4 
                    ON         ( 
                                          m_director.pid = p4.pid) 
                    where      p1.pid = p3.pid 
                    AND        p4.NAME NOT LIKE 'Yash Chopra' 
                    GROUP BY   p4.pid) 
ORDER BY movieswithyc DESC;

我没有得到正确的输出。我得到零行。有人可以修改上面的查询并给我正确的输出吗,我尝试了各种查询但没有得到任何东西

【问题讨论】:

  • 这个也不行
  • 可以清楚地解释您要达到的目标。或者可能发布您的数据和预期结果
  • 我正在使用 sqlite ,并且在该查询之后我得到零行。
  • 你能清楚地展示表格的数据和预期的结果吗?

标签: sql


【解决方案1】:

检查一下:

SELECT first.actor, 
       first.count 
FROM   (SELECT Trim(actor) AS Actor, 
               Count(*)    AS COUNT 
        FROM   m_cast mc 
               INNER JOIN (SELECT m.mid 
                           FROM   movie m) AS m 
                       ON m.mid = Trim(mc.mid) 
               INNER JOIN (SELECT md.pid, 
                                  md.mid 
                           FROM   m_director md) AS md 
                       ON md.mid = Trim(mc.mid) 
               INNER JOIN (SELECT p.pid, 
                                  p.NAME AS actor 
                           FROM   person p) AS pactor 
                       ON pactor.pid = Trim(mc.pid) 
               INNER JOIN (SELECT p.pid, 
                                  p.NAME AS director 
                           FROM   person p) AS pdirector 
                       ON pdirector.pid = Trim(md.pid) 
        WHERE  director LIKE '%Yash Chopra%' 
        GROUP  BY Trim(actor)) first 
       LEFT JOIN (SELECT actor, 
                         Max(count) AS COUNT 
                  FROM   (SELECT DISTINCT Trim(actor) AS Actor, 
                                          Count(*)    AS COUNT 
                          FROM   m_cast mc 
                                 INNER JOIN (SELECT m.mid 
                                             FROM   movie m) AS m 
                                         ON m.mid = Trim(mc.mid) 
                                 INNER JOIN (SELECT md.pid, 
                                                    md.mid 
                                             FROM   m_director md) AS md 
                                         ON md.mid = Trim(mc.mid) 
                                 INNER JOIN (SELECT p.pid, 
                                                    p.NAME AS actor 
                                             FROM   person p) AS pactor 
                                         ON pactor.pid = Trim(mc.pid) 
                                 INNER JOIN (SELECT p.pid, 
                                                    p.NAME AS director 
                                             FROM   person p) AS pdirector 
                                         ON pdirector.pid = Trim(md.pid) 
                          WHERE  director NOT LIKE '%Yash Chopra%' 
                          GROUP  BY Trim(actor), 
                                    director) 
                  GROUP  BY actor) second 
              ON first.actor = second.actor 
WHERE  first.count >= second.count 
        OR second.actor IS NULL 
ORDER  BY first.count DESC 


【讨论】:

    【解决方案2】:

    您可以检查以下 SQL。

    说明 - 第一个内联视图返回带有“Yash Chopra”的电影数量的人员列表。第二个内联视图返回与其他导演合作的电影数量的人员列表。最后,我筛选出那些使用“Yash Chopra”的电影数量大于“其他导演”的人。

    (select pc.name, count(distinct m.mid) count_movie
    from movie m
    join m_cast mc on m.mid = mc.mid
    join m_director md on m.mid = md.mid
    join person pc on mc.pid = pc.pid
    join person pd on md.pid = pd.pid
    where pd.name = 'YASH CHOPRA'
    group by pc.name) lst_yc
    join
    (select pc.name, count(m.mid) count_movie
    from movie m 
    join m_cast mc on m.mid = mc.mid
    join m_director md on m.mid = md.mid
    join person pc on mc.pid = pc.pid
    join person pd on md.pid = pd.pid
    where pd.name != 'YASH CHOPRA'
    group by pc.name) lst_wo
    on lst_yc.name = lst_wo.name
    where lst_yc.count_movie > lst_wo.count_movie
    

    【讨论】:

    • 这个答案在错误的上下文中。在这里,您将 Yash Chopra 与其他导演的总和进行比较。这不是问题上下文。您正在这样做:actor1, director1 ->15 actor1, director2 ->8 actor1, director3 ->9 假设导演 1 是 Yash Chopra 所以,根据问题上下文答案是:actor1, director1 ->15 因为它是 Yash Chopra 的最高值,但根据您的查询,它将比较像 15 > 8+9 这不是真的,所以它会返回一个空集,根据问题的上下文是错误的。
    【解决方案3】:
     SELECT * 
    FROM   ( 
                    SELECT   pc.NAME, 
                             Count(DISTINCT Trim(m.mid)) count_movie 
                    FROM     movie m 
                    JOIN     m_cast mc 
                    ON       Trim(m.mid) = Trim(mc.mid) 
                    JOIN     m_director md 
                    ON       Trim(m.mid) = Trim(md.mid) 
                    JOIN     person pc 
                    ON       Trim(mc.pid) = Trim(pc.pid) 
                    JOIN     person pd 
                    ON       trim(md.pid )= Trim(pd.pid) where pd.NAME = 'Yash Chopra' GROUP BY pc.NAME) lst_yc
                    JOIN 
                             ( 
                                      SELECT   pc.NAME, 
                                               count(trim(m.mid)) count_movie 
                                      FROM     movie m 
                                      JOIN     m_cast mc 
                                      ON       trim(m.mid) = trim(mc.mid ) 
                                      JOIN     m_director md 
                                      ON       trim(m.mid) = (md.mid) 
                                      JOIN     person pc 
                                      ON       trim(mc.pid) = trim(pc.pid) 
                                      JOIN     person pd 
                                      ON       trim(md.pid) = trim(pd.pid) 
                                      WHERE    pd.NAME != 'Yash Chopra' 
                                      GROUP BY pc.NAME) lst_wo 
                    ON       lst_yc.NAME = lst_wo.NAME 
                    WHERE    lst_yc.count_movie > lst_wo.count_movie
     
    

    这似乎是山塔努先生给出的答案。 但是你知道为什么这需要时间吗,我在 1 小时前运行了查询,但还没有产生结果。

    【讨论】:

    • 你能把电影,人物和其他表中的记录数等详细信息吗?您使用的是哪个数据库?它是关系数据库还是nosql db?请在您的原始问题中提供尽可能多的详细信息。
    • 我正在使用 sqlite ,并且在查询@ShantanuKher 之后我得到零行
    【解决方案4】:

    p2.NAME LIKE 'Yash Chopra' 和 p1.PID 这是您的代码行。 你应该这样写 TRIM(p2.NAME),TRIM(p1.PID) 因为电影表中的名称和 PID 包含空格和类似的东西。你应该正确处理它,否则它将返回零行,保留它记在心里。

    【讨论】:

      【解决方案5】:
      select t.actor,t.count from ( SELECT actor,count(distinct m.mid) as count
                            FROM   m_cast mc 
                                   INNER JOIN (SELECT m.mid 
                                               FROM   movie m) AS m 
                                           ON m.mid = Trim(mc.mid) 
                                   INNER JOIN (SELECT md.pid, 
                                                      md.mid 
                                               FROM   m_director md) AS md 
                                           ON md.mid = Trim(mc.mid) 
                                   INNER JOIN (SELECT p.pid, 
                                                      p.NAME AS actor 
                                               FROM   person p) AS pactor 
                                           ON pactor.pid = Trim(mc.pid) 
                                   INNER JOIN (SELECT p.pid, 
                                                      p.NAME AS director 
                                               FROM   person p) AS pdirector 
                                           ON pdirector.pid = Trim(md.pid) 
                            WHERE  director   LIKE '%Yash Chopra%' 
                            --and actor like '%Uttam Sodi%'
                            group by actor) as t
                            join( SELECT actor,count(distinct m.mid) as count
                            FROM   m_cast mc 
                                   INNER JOIN (SELECT m.mid 
                                               FROM   movie m) AS m 
                                           ON m.mid = Trim(mc.mid) 
                                   INNER JOIN (SELECT md.pid, 
                                                      md.mid 
                                               FROM   m_director md) AS md 
                                           ON md.mid = Trim(mc.mid) 
                                   INNER JOIN (SELECT p.pid, 
                                                      p.NAME AS actor 
                                               FROM   person p) AS pactor 
                                           ON pactor.pid = Trim(mc.pid) 
                                   INNER JOIN (SELECT p.pid, 
                                                      p.NAME AS director 
                                               FROM   person p) AS pdirector 
                                           ON pdirector.pid = Trim(md.pid) 
                            WHERE  director not  LIKE '%Yash Chopra%' 
                            group by actor) as w
                      where t.actor=w.actor and t.count>=w.count
      

      【讨论】:

        【解决方案6】:

        大家好,sql 新手,像我一样努力解决这个问题,你可以在下面找到解决方案的一部分(99%),因为我不想打断你的学习过程。但在经历它之前,请尝试最后一次。我感谢在这个论坛上讨论过他们对这个问题的各种想法的人们,因为他们引发了我的各种想法。

        在完成解决方案之前,您可以查看video 以了解以下代码中使用的各种新关键字的概述。 免责声明 - 在需要时使用修剪选项

        select actor,movies from 
            
        ( select mc.pid as actor,
                 md.pid as director,
                 p.pid,
                 count(*) as movies,
                 rank() over (partition by mc.pid order by count(*) desc) as rn,
                 p.name
          from m_director as md 
          join
          m_cast as mc on md.mid=mc.mid
          left join
          person as p on md.pid=p.pid and name = 'Yash Chopra'
          group by mc.pid,md.pid
         )
            
        where rn =1 and director like "nm0007181" ;
        

        精确解决方案 - 为了获得精确解决方案,您可以将上述 表格people 表格连接起来,以获得 演员的姓名 yash Chopra 导演的次数比其他任何导演都多。

        paila saisravan - 数据挖掘者

        【讨论】:

          【解决方案7】:
          select p.name,h.count 
          from(select mc.pid as mcpid,md.pid as mdpid,count(mc.MID) as count   
          from m_cast as mc
                           join m_director md 
                               on md.MID=mc.MID               
                           group by mc.pid ,md.pid 
                          ) h
                      join person p 
                          on h.mcpid=p.pid
                      where h.count = (select count(*) as count   
                                       from m_cast as mc
                                       join m_director md 
                                           on md.mid=mc.mid
                                       where mc.pid=h.mcpid 
                                       group by mc.pid,md.pid 
                                       order by count(*) desc
                                       limit 1)
                      and h.mdpid = (select pid 
                                     from person 
                                     where name like '%Yash Chopra%'
                                    )
                      order by h.count desc
          

          【讨论】:

            猜你喜欢
            • 2021-01-30
            • 2021-02-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-04
            • 2017-02-24
            • 2020-06-21
            相关资源
            最近更新 更多