【问题标题】:SQL GROUP BY and HAVING issueSQL GROUP BY 和 HAVING 问题
【发布时间】:2018-05-13 09:35:54
【问题描述】:

我正在学习一些 sql,我正在做一些练习以更好地学习,但我在使用 GROUP BY 函数时遇到了问题。 所以我有一些基本的演员表(标题、年份、角色名、姓名)和电影(标题、年份)。我的任务是列出在同一部电影中扮演多个角色的演员姓名。 这是我试过的代码:

SELECT A.Name
FROM Actors A, Movies M
WHERE A.Title = M.Title AND A.Year = M.Year
GROUP BY A.CharacterName HAVING COUNT(*) > 1;

但是我得到了这个错误:

错误 1055(42000):SELECT 列表的表达式 #2 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“new.A.Name”;这与 sql_mode = only_full_group_by 不兼容。

【问题讨论】:

    标签: mysql group-by


    【解决方案1】:

    如果movietitleyear 唯一标识,而“演员”由name 标识...我们不一定需要加入movie 表。

    我们可以通过这样的查询来识别出现在同一部电影中的多个 character_name 的演员:

    SELECT a.title
         , a.year
         , a.name
      FROM actors a
     GROUP
        BY a.title
         , a.year
         , a.name
    HAVING COUNT(DISTINCT a.character_name) > 1
    

    我们可以从 SELECT 列表中删除我们不需要的表达式。如果只需要演员的名字

    SELECT a.name
      FROM actors a
     GROUP
        BY a.title
         , a.year
         , a.name
    HAVING COUNT(DISTINCT a.character_name) > 1
    

    请注意,这可能会多次返回相同的演员名称。

    例如“迈克迈尔斯”作为多个角色出现在“奥斯汀权力”系列的多部电影中。第一个查询将列出电影和演员。此查询只是从 SELECT 列表中删除电影信息,但仍会多次留下“Mike Myers”,每部电影一次。

    如果删除重复项是规范的一部分,则可以调整查询。


    如果我们需要连接到 movie 表,我建议放弃用于连接操作的老式逗号语法,而改用 JOIN 关键字。并且还将连接谓词从WHERE 子句移动到ON 子句。

    如果我们假设titleyear 的组合是movie 的唯一标识符,则如下所示:

    SELECT a.name
      FROM actors a
      JOIN movie m 
        ON m.title  = a.title
       AND m.year   = a.year 
     GROUP
        BY a.title
         , a.year
         , a.name
    HAVING COUNT(DISTINCT a.character_name) > 1
    

    【讨论】:

      【解决方案2】:

      您在 select 上拥有的所有列也应该在 group by 指令下:

      SELECT A.Name, Count(A.CharacteName) 
      FROM Actors A, Movies M
      WHERE A.Title = M.Title AND A.Year = M.Year
      GROUP BY A.Name
      HAVING COUNT(A.CharacteName)) > 1;
      

      【讨论】:

      • 哦,我明白了,感谢您的帮助,现在它可以完美运行了!
      • 很高兴为您提供帮助!如果有用,请接受我的答案作为答案(答案下方的复选标记)。
      • 此查询完美运行,因为它返回了一个结果集......但它返回的结果集不满足问题中给出的规范......在同一部电影”。
      • 谢谢@spencer7593,现在我也看到了标题和年份的详细信息组:)
      • 此查询将返回出现在任何两部(或更多)电影中的任何演员的姓名。此查询中的唯一限制是这些电影中的角色名称不同。例如,以“罗伯特·雷德福”出现在“A Walk In The Woods”和“All Is Lost”为例。这是两个不同的角色名称,在两部不同的电影中。此查询将返回“Robert Redford”,但该返回似乎不符合规范... same 电影中的不同 character_name。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 2018-04-05
      • 2010-12-18
      相关资源
      最近更新 更多