假设我有一个非标准化的表格,其中包含电影演员姓名和他们所去过的电影。
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) 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 …令人讨厌。
有任何想法吗?
对于大型集合,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)获得同等的结果。
COUNT(1)
COUNT(*)
IFNULL(SUM(1),0)