【问题标题】:SQL query showing element more than once多次显示元素的 SQL 查询
【发布时间】:2011-02-21 11:43:06
【问题描述】:

我有以下 SQL 查询,但它并不完全有效,因为它多次显示每个元素。

select c.name, c.director, c.title, count(c.title) as numfilms
from casting c
join casting c1 on c1.name = c.name
Group by c.name, c.director, c.title
Having count (c.title) > 1
order by numfilms

所以它显示了哪些演员制作了超过 1 部电影。但不幸的是,这个查询显示每个演员的次数与他制作的电影数量一样多。使用 distinct 不起作用,因为演员可能曾在不同电影中使用相同的标题和不同的导演。

【问题讨论】:

    标签: sql


    【解决方案1】:
    select c.name, count(c.title) as numfilms
    from casting c
    Group by c.name
    Having count (c.title) > 1
    order by numfilms
    

    如果您只是在寻找演员姓名和他们所在的电影数量,您可以从分组中删除标题和导演并选择。

    编辑:通过阅读下面的评论,澄清理查德的第一个查询应该是正确的解决方案。

    【讨论】:

      【解决方案2】:

      这个问题没有意义 - 转换回自身的连接是令人困惑的部分 - 除非您需要如下所示的完整记录,否则完全没有必要。

      select c1.name, c1.director, c1.title, numfilms
      from
      (
          select c.name, count(c.title) as numfilms
          from casting c 
          Group by c.name
          Having count (c.title) > 1
      ) c
      join casting c1 on c1.name = c.name
      order by c1.name
      

      此查询显示:对于出现在多部电影中的每个演员,显示所有演员的电影。

      另一方面,如果您只关注在不止一部电影中出现的演员姓名,那么您只需要一次通过选角。

      select c.name, count(c.title) as numfilms
      from casting c 
      Group by c.name
      Having count (c.title) > 1
      

      令人困惑的部分是,如果您只想要名称,为什么要将 directortitle 添加到 SELECT 中?要放映演员的哪部电影?

      【讨论】:

      • 这个查询也不会返回多行吗?此查询将返回该演员参与的每部电影的电影和导演。原始问题的措辞可能会更好。
      • 我刚刚重读了我的问题。抱歉有点太含糊了。我所要做的就是向每个出演过不止一部电影的演员展示他所出演的电影。在这种情况下,我最初的查询是否正确?出于某种原因,我认为这是错误的放映方式,如下所示:actor1 film1 director 1 count;演员 1 电影 2 导演 2 计数。
      • 好的,澄清问题后,Richard 的第一个查询将是您要查找的内容。
      • @Sorin 您的查询应该可以工作,但会慢一些,因为它首先分解结果集,然后对计数进行分组。
      猜你喜欢
      • 1970-01-01
      • 2021-02-16
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多