Question

Ceci est la requête. Je suis surtout intéressé par la possibilité d'obtenir un meilleur moyen de récupérer les éléments pour lesquels j'utilise GROUP_CONCAT, ou si c'est une bonne façon de récupérer ces données. Je l'explose ensuite et mets les identifiants / noms dans un tableau, puis j'utilise une boucle for pour les afficher en écho.

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 de la requête est ici

texte alt http://www.krayvee.com/o2/explain.gif

Était-ce utile?

La solution

Personnellement, j'essaierais de diviser la requête en plusieurs requêtes. La plupart du temps, je recommanderais de supprimer les jointures acteur et genre afin de vous débarrasser de toutes ces fonctions group_concat. Faites ensuite des requêtes distinctes pour extraire ces données. Je ne sais pas si cela pourrait accélérer les choses, mais ça vaut probablement le coup.

Autres conseils

Vous avez essentiellement créé un produit cartésien entre genres , acteurs , directeurs , movie_ratings et épisodes . C’est pourquoi vous devez utiliser DISTINCT dans votre GROUP_CONCAT () , car le jeu de résultats préréglé comprend un nombre de lignes égal au produit du nombre de lignes correspondantes dans chaque table associée.

Notez que cette requête ne fonctionnerait pas du tout en SQL, sauf que vous utilisez MySQL, ce qui est permissif pour la règle à valeur unique .

Comme @Kibbee, je recommande généralement d'exécuter des requêtes distinctes dans des cas comme celui-ci. Il n'est pas toujours préférable de lancer une seule requête. Essayez de casser la requête et de faire du profilage pour en être sûr.

PS: Quoi? Pas de table _directors ? Vous ne pouvez donc pas représenter un déménagement avec plus d'un administrateur? : -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top