Это запрос. Мне в основном интересуется, есть ли лучший способ захватить материал, который я использую GROUP_CONCAT, или, если это волшебный способ захватить эти данные. Затем я взорву его и помещаю идентификаторы/имена в массив, а затем использую цикл for для их эха.
SELECT
mov_id,
mov_title,
GROUP_CONCAT(DISTINCT categories.cat_name) as all_genres,
GROUP_CONCAT(DISTINCT cat_id) as all_genres_ids,
GROUP_CONCAT(DISTINCT case when gen_dominant = 1 then gen_catid else 0 end) as dominant_genre_ids,
GROUP_CONCAT(DISTINCT actors.act_name) as all_actors,
GROUP_CONCAT(DISTINCT actors.act_id) as all_actor_ids,
mov_desc,
mov_added,
mov_thumb,
mov_hits,
mov_numvotes,
mov_totalvote,
mov_imdb,
mov_release,
mov_html,
mov_type,
mov_buytickets,
ep_summary,
ep_airdate,
ep_id,
ep_hits,
ep_totalNs,
ep_totalRs,
mov_rating,
mov_rating_reason,
mrate_name,
dir_id,
dir_name
FROM movies
LEFT JOIN _genres
ON movies.mov_id = _genres.gen_movieid
LEFT JOIN categories
ON _genres.gen_catid = categories.cat_id
LEFT JOIN _actors
ON (movies.mov_id = _actors.ac_movid)
LEFT JOIN actors
ON (_actors.ac_actorid = actors.act_id AND act_famous = 1)
LEFT JOIN directors
ON movies.mov_director = directors.dir_id
LEFT JOIN movie_ratings
ON movies.mov_rating = movie_ratings.mrate_id
LEFT JOIN episodes
ON mov_id = ep_showid AND ep_season = 0 AND ep_num = 0
WHERE mov_id = *MOVIE_ID* AND mov_status = 1
GROUP BY mov_id
EXPLAIN запроса здесь
Лично я попытался бы разбить запрос на несколько запросов. В основном я бы рекомендовал удалить актеры и жанры, чтобы вы могли избавиться от всех этих функций group_concat. Затем выполните отдельные запросы, чтобы извлечь эти данные. Не уверен, что это ускорит процесс, но, вероятно, стоит сделать снимок.
В основном вы делаете декартовское произведение между genres
, actors
, directors
, movie_ratings
и episodes
. Вот почему вы должны использовать DISTINCT
внутри вашего GROUP_CONCAT()
, потому что предварительно сгруппированный результирующий набор имеет число строк, равное произведению количества совпадающих строк в каждой связанной таблице.
Обратите внимание, что этот запрос не будет работать вообще в SQL, за исключением того, что вы используете MySQL, который разрешает однозначное правило.
Как и @Kibbee, я обычно рекомендую запускать отдельные запросы в таких случаях. Не всегда лучше запускать один запрос. Попробуйте разбить запрос и сделать некоторые профилирования, чтобы быть уверенным.
PS: Что? Нет таблицы _directors
? Значит, вы не можете представить ход с несколькими режиссерами?: -)