2009-07-24 11 views
1

J'ai une liste d'émissions de télévision stockées dans 1 table. Une autre table stocke les genres (action, romance, comédie).Comment effectuer cette tâche dans une seule requête mysql efficace?

La plupart des spectacles ont généralement plus d'un genre, donc avoir une seule colonne tv_genre et y mettre l'identifiant du genre n'est pas une option.

Je pourrais créer une table de recherche qui permettrait de stocker id id + genre de télévision, et je pourrais insérer 1 ligne pour chaque genre associé à l'émission. Où les choses deviennent floues pour moi, c'est quand je veux sortir une liste d'émissions sur l'index, et les noms de genre associés à l'émission de télévision. Comment lier les 3 tables ensemble en 1 requête efficace (au lieu d'exécuter une requête séparée pour chaque élément sur l'index, obtenir ses genres).

Aux fins de ce poste, les tables sont les suivantes

TV Show Table 
- tv_id 
- tv_name 

Genre Table 
- genre_id 
- genre_name 

Merci!

+0

vous sûr que c'est la structure de table entière? car il n'y a pas de relation entre les deux .. – moo

+0

@ orlandu63: Il mentionne dans la question une autre table (il l'appelle une table de correspondance) pour relier ces deux-là. – MitMaro

Répondre

6

http://dev.mysql.com/doc/refman/5.0/en/join.html

JOIN est au cœur de SQL. vous aurez le vent avec quelque chose comme

select tv_name, genre_name 
from tvshows 
    left join shows_genres on tvshows.tv_id = shows_genres.tv_id 
    left join genres on genres.genre_id = shows_genres.genre_id 
+0

Battez-moi. :) +1 – MitMaro

+0

Vous finirez avec un spectacle disparaissant s'il n'a aucun genre; vous voulez probablement rejoindre la gauche. – derobert

+0

@derobert: bon point. Quelle est la bonne SO-étiquette ici, éditer ma réponse ou voter le vôtre? – Jimmy

4

Vous pouvez utiliser la fonction GROUP_CONCAT de MySQL:

SELECT 
    t.tv_name, GROUP_CONCAT(g.genre_name) 
    FROM 
    tv_shows t 
    LEFT JOIN show_genres sg ON (t.tv_id = sg.tv_id) 
    LEFT JOIN genres g ON (sg.genre_id = g.genre_id) 
    WHERE 
    /* whatever */ 
    GROUP BY t.tv_name 

Votre page d'index ne sera pas particulièrement efficace; ça ne peut pas être: vous tirez toute la table (enfin, les trois tables). Si jamais cela devient un problème, regardez dans la mise en cache.

+0

Cest exactement comment je le fais ... et ses problèmes de charge provoquant pour moi. L'instruction group_concat de Remvoing réduit le temps d'exécution de 1 seconde à 0.1 –

+0

L'alternative est de ne pas faire le group_concat, et de le faire dans votre application (vous récupérerez une ligne par paire spectacle/genre). Ou, cachez-le. À quel point est-il important qu'un indice soit complètement à jour, est-il correct d'1 heure? – derobert

+0

La mise en cache serait très difficile à mettre en œuvre, car il existe environ 7 méthodes de tri et environ 1200 pages de contenu. –

0

Tableau Show-Genre - rv_id int - genre_id int

select tv_show.name, genre.genre_name from tv_show,genre, show_genre where 
show_genre.tv_id = tv_show.tv_id and genre.genre_id=show_genre.genre_id 

Quelque chose comme ça

0

ne peut pas être le meilleur sql mais mon idée était

select tv_name, genre_name 
from tv_table, genre_table, lookup_table 
where 
    tv_table.tv_name = "superman" 
    and 
    tv_table.tv_id = lookup_table.tv_id 
    and 
    lookup_table.genre_id = genre_table.genre_id 
Questions connexes