MySQL获取所有比平均外观更多的行

MySQL获取所有比平均外观更多的行,mysql,sql,Mysql,Sql,我有一个演员表,每个演员都出现在不同的电影中,我试着只选择那些出场次数超过每个演员平均出场次数的演员 这是我的尝试,但结果产生了相同的名称和不同的外观值,因此我认为我有一个错误 SELECT a.first_name AS fname, a.last_name AS lname, films_per_actor.num_films FROM actor as a, ( SELECT AVG(num_films) AS avg

我有一个演员表,每个演员都出现在不同的电影中,我试着只选择那些出场次数超过每个演员平均出场次数的演员

这是我的尝试,但结果产生了相同的名称和不同的外观值,因此我认为我有一个错误

 SELECT 
   a.first_name AS fname, 
   a.last_name AS lname, 
   films_per_actor.num_films 
 FROM 
   actor as a, 
   (
     SELECT 
       AVG(num_films) AS avg_films_num 
     FROM 
       (
         SELECT 
           COUNT(film_id) AS num_films, 
           a.actor_id 
         FROM 
           film_actor as f_a, 
           actor as a 
         WHERE 
           f_a.actor_id = a.actor_id 
         GROUP BY 
           actor_id
       ) as films_per_actor1
   ) as avg_films, 
   (
     SELECT 
       COUNT(film_id) AS num_films, 
       a.actor_id 
     FROM 
       film_actor as f_a, 
       actor as a 
     WHERE 
       f_a.actor_id = a.actor_id 
     GROUP BY 
       actor_id
   ) as films_per_actor 
 WHERE 
   films_per_actor.num_films > avg_films.avg_films_num + 10 
 ORDER BY 
   fname, 
   lname
但结果是

"ADAM"  "GRANT" "40"
"ADAM"  "GRANT" "39"
"ADAM"  "GRANT" "42"
"ADAM"  "GRANT" "41"
"ADAM"  "HOPPER"    "40"
"ADAM"  "HOPPER"    "39"
"ADAM"  "HOPPER"    "42"
"ADAM"  "HOPPER"    "41"
"AL"    "GARLAND"   "40"
"AL"    "GARLAND"   "39"
"AL"    "GARLAND"   "41"
"AL"    "GARLAND"   "42"
"ALAN"  "DREYFUSS"  "39"
"ALAN"  "DREYFUSS"  "40"
"ALAN"  "DREYFUSS"  "42"
"ALAN"  "DREYFUSS"  "41"

正如@Eric所说,使用现代显式连接语法可能会完全避免这个问题。在actor表和两个子查询之间没有联接条件。所以你会得到每个演员,每一个计数都超过平均值

此外,可以通过多种方式简化查询

SELECT 
  a.first_name AS fname, 
  a.last_name AS lname, 
  fpa.num_films 
FROM 
  actor as a 
  INNER JOIN (
    SELECT 
      actor_id, 
      COUNT(film_id) AS num_films 
    FROM 
      film_actor 
    GROUP BY 
      actor_id
  ) AS fpa ON a.actor_id = fpa.actor_id 
  INNER JOIN (
    SELECT 
      COUNT(*)/ COUNT(DISTINCT actor_id) AS avg_films_num 
    FROM 
      film_actor
  ) AS avg_films ON fpa.num_films > avg_films.avg_films_num 
ORDER BY 
  fname, 
  lname
或者:

  SELECT 
  a.first_name AS fname, 
  a.last_name AS lname, 
  fpa.num_films 
FROM 
  actor as a 
  INNER JOIN (
    SELECT 
      actor_id, 
      COUNT(film_id) AS num_films 
    FROM 
      film_actor 
    GROUP BY 
      actor_id
  ) AS fpa ON a.actor_id = fpa.actor_id 
WHERE 
  fpa.num_films > (
    SELECT 
      COUNT(*)/ COUNT(DISTINCT actor_id) AS avg_films_num 
    FROM 
      film_actor
  ) 
ORDER BY 
  fname, 
  lname

在没有任何数据的情况下解码您的查询对我们来说有点太多了。请分享示例输入和预期输出。Mayank,非常感谢您的回答,我们将上传一个经过编辑的最小问题,谢谢!草莓,有时候,我真不敢相信这里有多少人会因为它是虚拟的,什么都可以说而充满了自己。我明白你的幽默,但我会因为留下这样的评论而受到惩罚。小心点,我的朋友。使用合适的
加入
。它已经存在超过20年了。样本输入???没有数据可供测试时,我们如何提供帮助?