2010-03-02 5 views
1

J'ai quelques tables.MySql Aide 'Select'

Ces tableaux ont tous une colonne commune appelée « classified_id »:

main_table:   cars_table:    
    id (PK) => 4222  id (PK) => 1021    
    classified_id => 25 classified_id => 25 

Maintenant, je veux à chaque fois qu'une recherche est effectuée pour comparer si l'un des main_table.classified_id correspond à l'une cars_table.classified_id (dans ce cas).

la table cars_table peut renvoyer aucune correspondance! le classified_id dans chaque table est la seule relation. Je n'aurais jamais besoin de comparer cars_table.classified_id à main_table.classified_id, mais l'inverse est ce dont j'ai besoin (main_table.classified_id = cars_table.classified_id).

Je ne sais pas quel type de Rejoindre pour utiliser ... Toute aide? Joint gauche?

Merci

+0

S'il vous plaît indiquer plus clairement ce que vous essayez de faire. Voulez-vous obtenir uniquement des lignes de main_table qui sont également dans cars_table? Ou voulez-vous obtenir toutes les lignes de main_table et obtenir des informations supplémentaires que la ligne est également dans cars_table? –

+0

non, seulement les lignes qui correspondent dans les deux tables sur classified_id – pesar

Répondre

0

Oui, il est une jointure gauche

Quelque chose comme

SELECT * 
FROM main_table mt LEFT JOIN 
     cars_table ct ON mt.classified_id = ct.classified_id 
+0

Ok, un petit suivi Q, Que se passerait-il si je devais changer les places des variables autour de la marque 'égale' dans votre code, donc ce serait 'ON ct.classified_id = mt.classified_id '? Est ce que c'est important? – pesar

+0

Non, ce n'est pas grave, c'est le LEFT JOIN et les tables qui comptent. –

+0

pesar, ça ne va pas parce que l'égalité est une relation symétrique: http://en.wikipedia.org/wiki/Symmetric_relation – allyourcode

0
SELECT * FROM main_table LEFT JOIN cars_table ON main_table.classified_id = cars_table.classified_id 

Retournera 1- ?? copies des lignes main_table en fonction du nombre de cars_table qui correspond. S'il n'y a pas de correspondance, toutes les valeurs de cars_table seront NULL

0

Je ne sais pas exactement ce que vous demandez, mais en supposant que vous recherchez tous les enregistrements de main_table qui correspondent à certaines conditions, et que vous aimeriez apporter tous les enregistrements du cars_table qui ont le même classified_id que l'un des enregistrements correspondants dans la table principale, même s'il n'y a pas de tels enregistrements dans la cars_table, vous devriez utiliser jointure gauche comme ceci:

 
SELECT * 
FROM main_table AS M 
    LEFT JOIN cars_table as C 
    ON C.classified_id = M.classified_id 
WHERE 
    f(M.foo) 

Lorsqu'il existe un enregistrement M tel que f (M.foo) évalue à TRUE, mais pas d'enregistrement C correspondant, l'enregistrement M apparaît toujours dans le jeu de résultats, mais tous les champs C seront NULL.

Une explication plus approfondie des jointures externes gauche (même chose comme une jointure gauche) se trouve ici:

http://en.wikipedia.org/wiki/Left_outer_join#Sample_tables

Vous aurez besoin de regarder les données d'échantillon pour donner un sens de l'exemple ils donnent à jointure externe gauche:

http://en.wikipedia.org/wiki/Left_outer_join#Sample_tables