MySQL Получить все строки, которые появились больше, чем в среднем - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть таблица актеров, где каждый актер появлялся в разных фильмах, и я стараюсь выбирать только тех актеров, которые появлялись больше, чем в среднем на одного актера.

Вот моя попытка, но результат дает одно и то же имя с разными значениями внешнего вида, поэтому я думаю, что у меня ошибка

 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"

1 Ответ

0 голосов
/ 06 ноября 2018

Как сказал @Eric, использование современного явного синтаксиса JOIN, вероятно, позволило бы полностью избежать этой проблемы. У вас нет критериев соединения между таблицей акторов и двумя подзапросами. Таким образом, вы получите каждого актера, каждый счет которого больше среднего.

Кроме того, запрос может быть упрощен несколькими способами

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...