【问题标题】:SQL Group by Count of Primary Key按主键计数的 SQL 组
【发布时间】:2018-09-01 07:56:04
【问题描述】:

我将两个表与一个内部联接组合在一起,其中主 ID 是电影 ID,我想按每个演员每年的电影数量对它们进行分组。但是 - 可能是因为电影 ID 是主键 - 我得到的结果不正确。下面是我的代码。该数据库来自 iMDB,它有一个带有电影和演员的演员表、一个演员表和一个带有年份的电影表。

SELECT 
                c.actor_id, m.year, COUNT(m.title)
            FROM
                cast c
            INNER JOIN movies m
            WHERE
                c.movie_id = m.id
            GROUP BY m.year
            ORDER BY COUNT(m.title) DESC;

【问题讨论】:

  • 编辑您的问题并显示示例数据和所需结果。

标签: mysql sql inner-join


【解决方案1】:

需要在GROUP 子句中包含actor_id,因为您正在计算每位演员每年的电影数量。

SELECT 
                c.actor_id, m.year, COUNT(m.title)
            FROM
                cast c
            INNER JOIN movies m
            WHERE
                c.movie_id = m.id
            GROUP BY c.actor_id, m.year
            ORDER BY COUNT(m.title) DESC;

【讨论】:

    【解决方案2】:

    未聚合的所有内容都必须在GROUP BY 中。大多数 RDBMS 会在您的 SQL 上出错,但 MySQL 会给您“免费通行证”:

    SELECT 
        c.actor_id, m.year, COUNT(m.title)
    FROM
        cast c
    INNER JOIN actor_movie am ON am.actor_id=am.actor_id
    INNER JOIN movies m ON am.movie_id=m.movie_id
    WHERE
        c.movie_id = m.id
    GROUP BY c.actor_id, m.year
    ORDER BY COUNT(m.title) DESC;
    

    请注意,内部连接需要一个您未包含的 ON 子句。我添加了一个可能的实现,其中包含我认为您拥有(或应该拥有)的演员电影表。

    【讨论】:

    • 无论数据库是否允许,如果他希望计数是每个演员,它需要在GROUP BY
    • @Barmar 我试图通过指出需要在 group by 中使用 actor_id 来表明其他 DB 可能会阻止 OP。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    相关资源
    最近更新 更多