这是查询。我最感兴趣的是如果有更好的方法来获取我使用GROUP_CONCAT的东西,或者如果这是一个很好的方法来获取这些数据。然后我将它爆炸,并将ids / names放入一个数组中,然后使用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在这里
答案 0 :(得分:1)
就个人而言,我会尝试将查询分解为多个查询。大多数情况下,我建议删除Actor和类型连接,以便您可以摆脱所有这些group_concat函数。然后执行单独的查询以将此数据拉出。不确定它是否会加快速度,但它可能值得一试。
答案 1 :(得分:0)
您基本上在genres
,actors
,directors
,movie_ratings
和episodes
之间完成了笛卡尔积。这就是你必须在DISTINCT
中使用GROUP_CONCAT()
的原因,因为预先分组的结果集的行数等于每个相关表中匹配行数的乘积。
请注意,此查询在SQL中根本不起作用,除了您使用的是允许单值规则的MySQL。
与@Kibbee一样,我通常建议在这种情况下运行单独的查询。运行单个查询并不总是更好。尝试分解查询并进行一些分析以确定。
PS:什么?没有_directors
表?所以你不能代表一个以上导演的举动? : - )