MySQL правильный способ SELECT с участием многих таблиц - PullRequest
0 голосов
/ 01 июля 2011

У меня есть база данных фильмов, в которой есть эти таблицы: new_movies, рейтинги, crit_ratings, цвета

Я пытаюсь выполнить этот оператор SELECT, который объединит эти 4 таблицы в одном фильме, используя 'mid' (movieid):

SELECT DISTINCT 
   new_movies.*,
   movies_db.*,
   ratings.rating,
   ratings.count,color,
   critic_ratings.rating AS critic_ratings 
FROM 
   new_movies 
INNER JOIN 
   movies_db 
ON 
   new_movies.mid = movies_db.mid 
LEFT JOIN 
   ratings 
ON 
   new_movies.mid = ratings.mid 
LEFT JOIN 
   colors 
ON 
   new_movies.mid = colors.mid 
LEFT JOIN 
   critic_ratings 
ON 
   new_movies.mid = critic_ratings.mid 
ORDER BY 
   title ASC

Но я получаю эту ошибку:

SELECT будет проверять более чем MAX_JOIN_SIZE строк;проверьте ваш WHERE и используйте SET SQL_BIG_SELECTS = 1 или SET SQL_MAX_JOIN_SIZE = #, если SELECT в порядке

Как правильно выполнить этот запрос?

Ответы [ 3 ]

1 голос
/ 01 июля 2011

Если вы не хотите включать большие выборки, вы можете изменить это, используя коррелированные подзапросы.(Я не знаю, достигнете ли вы по-прежнему лимита или нет.)

SELECT DISTINCT 
   new_movies.*,
   movies_db.*,
   (SELECT rating FROM ratings        WHERE new_movies.mid = ratings.mid) AS rating,
   (SELECT count  FROM ratings        WHERE new_movies.mid = ratings.mid) AS rating_count,
   (SELECT color  FROM colors         WHERE new_movies.mid = colors.mid)  AS colour,
   (SELECT rating FROM critic_ratings WHERE new_movies.mid = critic_ratings.mid) AS critic_ratings
FROM 
  new_movies 
INNER JOIN 
  movies_db 
    ON new_movies.mid = movies_db.mid 
ORDER BY 
   title ASC

Кроме того, стоит проверить, действительно ли причиной этого являются ЛЕВЫЕ СОЕДИНЕНИЯ.

SELECT DISTINCT 
   new_movies.*,
   movies_db.*
FROM 
  new_movies 
INNER JOIN 
  movies_db 
    ON new_movies.mid = movies_db.mid 
ORDER BY 
   title ASC
0 голосов
/ 01 июля 2011

Нет проблем с вашим запросом per se .Просто вы выбираете все фильмы (без ГДЕ, без ОГРАНИЧЕНИЯ) и, поскольку вы присоединяетесь к рейтингам, например, он объединит все оценки для каждого фильма.Вы только что достигли максимального количества данных, разрешенного для объединений.

Я не уверен, почему вам нужно выбрать все фильмы.Возможно, вы можете использовать ограничение.В противном случае вы можете просто попробовать решения в сообщении об ошибке.

0 голосов
/ 01 июля 2011

почему у вас есть фильмы и таблица new_movies? конечно, для этого было бы достаточно поля даты релиза - тоже обрезалось бы соединение ...

с этой целью я бы создал представление этих данных и запросил бы их.

Но вернемся к вашему запросу:

SELECT DISTINCT
    new_movies.*,
    movies_db.*,
    ratings.rating,
    ratings.count,
    color,
    critic_ratings.rating AS critic_ratings
FROM
    new_movies
INNER JOIN
    movies_db
ON
    new_movies.mid = movies_db.mid
LEFT JOIN
    ratings
ON
    new_movies.mid = ratings.mid
LEFT JOIN
    colors
ON
    new_movies.mid = colors.mid
LEFT JOIN
    critic_ratings
ON
    new_movies.mid = critic_ratings.mid
ORDER BY
    title ASC

Я не вижу ничего очевидного ... возможно, вы можете опубликовать результаты запроса объяснения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...