2010-02-22 9 views
2

Je suis nouveau à JOINS dans MySQL.Quel genre de JOIN devrais-je utiliser ici?

J'ai six tables: t1, t2, t3, t4, t5, t6. J'ai également une table principale: main_table. TOTAL 7 TABLES! La première colonne de toutes les tables est appelée classified_id.

Si l'utilisateur recherche "voitures" alors la table principale correspondra à tout dans la table t1 (qui est la table des voitures) où class_id est le même dans les deux tables.

Alors:

SELECT * FROM main_table, t1 WHERE main_table.classified_id=t1.classified_id 

Cela fonctionne très bien, même si je ne suis pas sûr que ce soit la façon de rejoindre ici. La performance est un problème dans mon cas!

Cependant, voici mon problème. Chaque fois que TOUTES LES CLASSIFICATIONS sont recherchées, alors je dois faire correspondre le main_table.classified_id aux autres tables classified_id colonne et obtenir chaque classé il y a.

Comment cette requête doit-elle être constituée?

SELECT * FROM main_table, t1, t2, t3, t4, t5, t6 // I have this so far which is not much! 

Si vous avez besoin de plus d'entrée il suffit de demander et je vais mettre à jour ce Q.

Merci

EDIT: Table configuration:

 main_table:    t1: 
    ID(PK)     ID (PK) 
    classified_id -> 25  classified_id  -> 25 
    category -> CARS  year  -> 1997 
+0

Que pensez-vous qu'il arrivera si dans l'une des tables il n'y a pas d'enregistrement avec class_id. Parce que c'est le critère principal qui joint le type à utiliser. – anthares

+0

Il semble que t1-t6 sont des entrées classifiées, chacune avec 2 colonnes, id et valeur, où 'valeur' ​​est quelque chose comme '2008 Camry. Ça fonctionne bien. Est-ce correct? –

+0

puis retour 0! Aucun résultat! –

Répondre

4

Si la ligne existerait dans tous les tables (c'est-à-dire que chaque table a une ligne pour un ID spécifique), vous devez utiliser une jointure interne:

SELECT 
    m.classified_id 
    ,m.category 
    ,t1.year 
    ,........ 
FROM 
    main_table m 
    INNER JOIN t1 ON m.classified_id = t1.classified_id 
    INNER JOIN t2 ON m.classified_id = t2.classified_id 
    INNER JOIN t3 ON m.classified_id = t3.classified_id 
    INNER JOIN t4 ON m.classified_id = t4.classified_id 
    INNER JOIN t5 ON m.classified_id = t5.classified_id 
    INNER JOIN t6 ON m.classified_id = t6.classified_id 

Si la ligne n'existe pas dans toutes les tables, alors vous utilisez GAUCHE REJOINT pour que les lignes ne sont pas supprimées

+0

Cela retournera une erreur, à cause de l'utilisation de 'SELECT *' - il y a des collisions de noms de colonnes avec 'classified_id'. –

+0

J'ai modifié la réponse en fonction de cette modification de/camran – John

2

Utilisation:

SELECT mt.*, 
      t1.*, 
      t2.*, 
      t3.*, 
      t4.*, 
      t5.*, 
      t6.* 
    FROM MAIN_TABLE mt 
LEFT JOIN TABLE_1 t1 ON t1.classified_id = mt.classified_id 
LEFT JOIN TABLE_2 t2 ON t2.classified_id = mt.classified_id 
LEFT JOIN TABLE_3 t3 ON t3.classified_id = mt.classified_id 
LEFT JOIN TABLE_4 t4 ON t4.classified_id = mt.classified_id 
LEFT JOIN TABLE_5 t5 ON t5.classified_id = mt.classified_id 
LEFT JOIN TABLE_6 t6 ON t6.classified_id = mt.classified_id 

je LEFT JOIN s parce que si JOIN a été utilisé - les enregistrements qui n'auraient pas d'enregistrement à l'appui dans au moins l'un des tableaux t1/2/3/4/5/6 seraient omis. Vous pourriez trouver this link helpful for understanding JOINs.

Questions connexes