2011-03-03 5 views
8

J'ai une table de base et 3 tables qui étendent la table 'de base' de différentes manières. Je travaille avec des données MLS et j'ai une table 'commune' qui contient des informations communes à toutes les listes de mls puis une table qui a spécifiquement des informations "résidentielles", une pour "commercial", etc ... I J'ai utilisé mls nombre pour rejoindre une seule table quand je connais une liste quand le type de propriété est connu, mais pour la recherche je veux tous les joindre et avoir les champs spéciaux disponibles pour les critères de recherche (pas simplement la recherche de la table commune).Quel type de jointure utiliser?

Quel type de jointure me donnera un jeu de données qui contiendra toutes les listes (y compris les champs étendus dans les tables idx)?

Pour chaque enregistrement de table commune, il existe un seul enregistrement correspondant dans SEULEMENT UN des tables idx.

     ___________ 
        |   | 
        | COMMON | 
        |   | 
        |___________| 
         _|_ 
          | 
     ___________________|_____________________ 
    _|_     _|_     _|_ 
_____|_____   _____|______   ____|______ 
|   |  |   |   |   | 
| IDX1 |  | IDX2  |   | IDX3 | 
|   |  |   |   |   | 
|___________|  |____________|   |___________| 
+1

+1 pour une belle carte! – Orbit

+1

Généralement la recherche est écrite * pour * le modèle, mais les vues peuvent être utilisées pour aplatir un modèle ... de toute façon, selon les données, probablement un INNER ("normal"), mais peut-être une jointure GAUCHE. La question n'a pas beaucoup de sens pour moi - c'est trop vague. –

+0

Pouvez-vous afficher les structures de la table et la structure de la sortie voulue? En outre, sont-ce tous ces rapports un à un? – Oded

Répondre

6

Si vous voulez tout en une seule rangée, vous pouvez utiliser quelque chose comme ce format. Fondamentalement, il vous donne tous les champs « communs », puis les autres champs s'il y a un match autrement NULL:

SELECT Common.*, 
     Idx1.*, 
     Idx2.*, 
     Idx3.* 
FROM Common 
LEFT JOIN Idx1 
    ON Idx1.MLSKey = Common.MLSKey 
LEFT JOIN Idx2 
    ON Idx2.MLSKey = Common.MLSKey 
LEFT JOIN Idx3 
    ON Idx3.MLSKey = Common.MLSKey 

Gardez à l'esprit, il est préférable de lister les champs que d'utiliser le SELECT * chaque fois que possible ...

Aussi, je suppose que la syntaxe MySQL est la même que SQL Server, qui est ce que j'utilise.

+1

Et l'utilisation d'une ** jointure gauche (externe) ** est la clé car une jointure ** (interne) ** ne renvoie aucune ligne à cause de la description des données dans la question d'origine. –

0

J'ai une configuration similaire des tables où la table 'jobs' est la table principale.

J'ai cette requête qui sélectionne certains éléments de chacun des 2 autres tables:

SELECT jobs.frequency, twitterdetails.accountname, feeds.feed 
FROM jobs 
JOIN twitterdetails ON twitterdetails.ID = jobs.accountID 
JOIN feeds ON jobs.FeedID = feeds.FeedID 
WHERE jobs.username ='".$currentuser."';"); 

Donc, comme vous pouvez le voir, pas spécifique JOIN, mais les champs de liaison définis. Vous auriez probablement juste besoin d'une ligne JOIN supplémentaire pour votre installation.

0

solution truand/mauvaise tentative/peut-être mal compris la question:

SELECT common.*,IDX1.field,NULL,NULL FROM COMMON 
LEFT JOIN IDX1 ON COMMON.ID = IDX1.ID 
WHERE TYPE="RESIDENTIAL" 
UNION ALL 
SELECT common.*,NULL,IDX2.field,NULL FROM COMMON 
LEFT JOIN IDX2 ON COMMON.ID = IDX2.ID 
WHERE TYPE="RESIDENTIAL" 
UNION ALL 
SELECT common.*,NULL,NULL,IDX3.field FROM COMMON 
LEFT JOIN IDX3 ON COMMON.ID = IDX3.ID 
WHERE TYPE="INDUSTRIAL" 
0

Orbit est proche. Utilisez la jointure interne, pas la jointure gauche. Vous ne voulez pas que Common apparaisse dans la jointure si elle n'a pas de ligne dans idx.

Vous DEVEZ regrouper les requêtes 3 pour obtenir les résultats appropriés en supposant que chaque enregistrement en commun ne peut avoir qu'une table IDX. Branchez "NULL" pour remplir les colonnes que chaque table idx est manquant afin qu'ils puissent être unis.

BTW votre conception de table est bonne.