我想计算“子”在 N..N 关系中出现的次数,并按“父”的字段对结果进行分组。
<小时/>我很难用准确的词语来描述这个问题,所以假设我有 3 个表:电影、 Actor 、播放 ,其中 Play 是 Movie 和 Actor 之间的关系。 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/