mysql - 子查询对项目进行计数,然后按主查询的字段对它们进行分组,不重复

标签 mysql count correlated-subquery distinct-values

我想计算“子”在 N..N 关系中出现的次数,并按“父”的字段对结果进行分组。

<小时/>

我很难用准确的词语来描述这个问题,所以假设我有 3 个表:电影 Actor 播放 ,其中 PlayMovieActor 之间的关系。 Actor 可以在电影中扮演角色。 数据库中可能存在某些 Actor ,但从未在数据库中的任何电影中出演过。

电影表中,我有一个类型

我想计算每种类型的扮演者的数量,而不是每种类型对同一 Actor 进行多次计数。

<小时/>

我目前在每次播放的 actor_id 上使用 DISTINCT,这意味着理论上在同一部电影中多次播放的 Actor 将出现一次...但这是一个无意义的场景(因为该 Actor 只会出现播放表中的每部电影一次),所以它没有用,不是我想要的。还有更好的主意吗?

我想将所有内容保留在一个查询中,因为我实际上正在执行其他子查询来获取每个流派的其他统计信息。

这是我的查询的样子,没有其他子查询:

SELECT
    movie.genre,

    SUM(
        SELECT COUNT(DISTINCT play.actor_id)
        FROM play
        WHERE play.movie_id = movie.id
    ) AS number_of_actors

    FROM movie

    GROUP BY movie.genre

目前,如果一个 Actor 出演过多部电影,他会被计算多次。

最佳答案

您的问题是,您无法在求和的每个元素之间进行明确的通信,因此最终会出现重复的值。将其编写为 JOIN 会更简单。我使用了 LEFT JOIN 以防电影在 play 表中没有条目,在这种情况下,COUNT 将为 0。

SELECT m.genre
       COALESCE(COUNT(DISTINCT p.actor_id), 0) AS number_of_actors
FROM movie m
LEFT JOIN play p ON p.movie_id = m.id
GROUP BY m.genre

关于mysql - 子查询对项目进行计数,然后按主查询的字段对它们进行分组,不重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57674425/

相关文章:

MySQL按日期时间关联子查询顺序

php - 信息未存储在数据库中

php - 根据用户从数组输入更新数据库

php - 一个 while 循环中的两个查询

mysql - 表中的 SQL 字数限制

MYSQL 忽略重复值并获取唯一计数

php - 在处理超过 190,000 个每月任务时,Cron 作业是否实用?

c# - 索引和计数必须引用字符串中的位置。参数名称 : count

mysql - SELECT 中的子查询还是 JOIN 中的子查询?

sql - 在 postgresql 的子查询中使用外部查询结果