一尘不染

当查询具有GROUP BY时,如何获得总计的百分比?

mysql

假设我有一个非标准化的表格,其中包含电影演员姓名和他们所去过的电影。

CREATE TABLE movies_actors (
  movies_actors_id INT,
  movie VARCHAR(255),
  actor VARCHAR(255),
  PRIMARY KEY (movies_actors_id)
);

我要做的SELECT actor, COUNT(1) FROM movies_actors GROUP BY actor是找出演员去过多少部电影。但是我也想找出演员去过多少部电影。

我想我可以这样做:

SELECT
  actor,
  COUNT(1) AS total,
  COUNT(1) / (SELECT COUNT(1) FROM movies_actors) * 100 AS avg
FROM movies_actors
GROUP BY actor;

但这似乎… idk …令人讨厌。

有任何想法吗?


阅读 776

收藏
2020-05-17

共1个答案

一尘不染

对于大型集合,JOIN的性能可能优于子查询。

SELECT ma.actor
     , COUNT(1) AS total
     , COUNT(1) / t.cnt * 100 AS `percentage`
  FROM movies_actors ma
 CROSS
  JOIN (SELECT COUNT(1) AS cnt FROM movies_actors) t
 GROUP
    BY ma.actor
     , t.cnt

对于大型集合,当返回很大比例的行时,JOIN操作通常可以胜过子查询。在您的情况下,它不是相关子查询,因此MySQL不必多次执行该子查询,因此它可能没有任何区别。

注意COUNT(1)…的非粉丝,我们可以COUNT(1)COUNT(*)或替换任何和所有出现的或IFNULL(SUM(1),0)获得同等的结果。

2020-05-17