2009-06-25 9 views
0

Ceci est la requête. Je suis surtout intéressé s'il y a une meilleure façon d'attraper les choses que j'utilise GROUP_CONCAT pour, ou si c'est une bonne façon de saisir ces données. Je l'explose ensuite, et place les ids/names dans un tableau, puis utilise une boucle for pour les faire écho.Un moyen d'optimiser cette requête mysql?

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 

EXPLIQUER de la requête est ici

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

Répondre

1

Personnellement, je voudrais essayer de briser la requête en de multiples requêtes. La plupart du temps, je recommanderais de supprimer l'acteur et le genre pour que vous puissiez vous débarrasser de toutes ces fonctions de group_concat. Ensuite, faites des requêtes séparées pour extraire ces données. Je ne sais pas si cela accélèrerait les choses, mais ça vaut probablement la peine.

0

Vous avez essentiellement fait un produit cartésien entre genres, actors, directors, movie_ratings et episodes. C'est pourquoi vous devez utiliser DISTINCT à l'intérieur de votre GROUP_CONCAT(), car l'ensemble de résultats pré-groupés a 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 dans SQL, sauf que vous utilisez MySQL qui est permissif à propos de la règle de valeur unique .

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

PS: Quoi? Pas de table _directors? Donc vous ne pouvez pas représenter un déménagement avec plus d'un directeur? :-)

+0

Yah J'étais juste paresseux. : P Y at-il un problème avec l'utilisation de GROUP_CONCAT? –

+0

Il n'y a rien de mal à utiliser GROUP_CONCAT quand vous en avez besoin, mais dans votre cas, vous allez tout simplement exploser la liste, alors pourquoi s'embêter? –

+0

Figuré Je lancerais des requêtes elss, ce qui est bien. Je suppose que je les remplace par 2 autres requêtes et voir ce qui se passe. –

Questions connexes