【问题标题】:SQL find values connected to more than 199 unique valuesSQL 查找连接到超过 199 个唯一值的值
【发布时间】:2017-03-13 14:04:31
【问题描述】:

我今天早些时候问过this question,但我认为我说得不够清楚。

我的问题是: 哪些演员(姓名和电影数量)在超过 199 部电影中扮演了具有独特角色名称的角色?

我有这些表:

Table "public.filmparticipation"
  Column  |  Type   | Modifiers 
----------+---------+-----------
 partid   | integer | 
 personid | integer | not null
 filmid   | integer | not null
 parttype | text    | not null


Table "public.filmcharacter"
    Column     |  Type   | Modifiers 
---------------+---------+-----------
 partid        | integer | 
 filmcharacter | text    | 
 billingpos    | integer |


Table "public.person"
  Column   |     Type     | Modifiers 
-----------+--------------+-----------
 personid  | integer      | 
 lastname  | text         | not null
 firstname | text         | 
 gender    | character(1) |

为了澄清问题: 我想找到所有出演过超过 199 部电影的演员,他们的角色名字是独一无二的。这意味着他们在这部电影中的角色名称尚未在数据库中的任何其他电影中使用。我想获得一个包含演员姓名的列表,以及他们在其中角色名称唯一的电影中的数量。结果看起来像这样(我使用完全随机的值):

  Name     | Filmcharacter|
-----------+--------------+
 Pitt      | 465          | 
 Clooney   | 265          |
 Depp      | 320          | 
 Jolie     | 229          |

【问题讨论】:

    标签: sql


    【解决方案1】:

    试试这个:

    Select p.personId, p.firstName, p.LastName, count(*)
    from public.Person p
       join public.filmparticipation fp
          on fp.personId = p.personId
                 -- subquery ensures that the part has not been in any other film
             and (Select count(*) from public.filmparticipation
                  where partId = fp.PartId) == 1
    Group By p.personId, p.firstName, p.LastName
    Having count(*) > 199    -- <-- this filters out actors in less than 199 films
    

    【讨论】:

    • 据我了解,这个解决方案为我提供了在超过 199 部电影中演出的演员,无论他们的角色名称是否唯一(如果我错了,请纠正我)。我想找到那些在超过 199 部电影中扮演角色的演员,他们的角色名字在所有电影中都是独一无二的。这意味着一个演员在总共 450 部电影中扮演过角色,其中超过 199 部电影有一个独特的角色名称,这将与此案有关。这意味着计数应该是具有唯一角色名称的电影,而不是电影总数。
    • 不,这应该将演员名单限制在那些曾出演过 199 部电影(或更多)的电影中,而他们所扮演的角色从未出现在任何其他电影中。这就是子查询的作用,它将连接限制在仅在一部电影中使用该部分的那些电影中。并且 v=因为连接受到限制,所以 count(*) 是仅对那些电影的计数,(其中部分是唯一的。)
    • 嗯,好吧。练习告诉我我应该得到 23 行,但我得到了 100++。也许我没有正确解释这个问题。或者也许我误解了这个问题。不确定.. 问题是:在超过 199 部电影中,哪些演员(姓名和电影数量)扮演过具有唯一角色名称(仅在一部电影中出现的角色名称)的角色?你的理解和我的不同吗?
    • 好吧,看看查询生成的数据。没有数据我无法测试我的 SQL。列出的演员中是否有出演过不止一部电影的角色?难道他们真的意味着只有只玩过一个动作的角色吗?
    • 嗯,是的,你是对的,它实际上看起来是正确的。我可能误解了这个问题。无论如何,非常感谢您的时间和帮助!
    【解决方案2】:

    你可以使用join、count和have子句

    select p.lastname, p.firstname, count(f.*) as Filmcharacter 
    from person as p 
    inner join filmparticipation as c on p.personid = c.personid 
    inner join  filmcharacter as f on f.partid = c.partid
    group by p.lastname, p.firstname
    having count(*) > 199
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多