2010-12-13 7 views
1

Je souhaite extraire des données de trois tables, mais si les données n'existent pas dans la troisième table, les données des deux autres tables doivent être extraites.Données provenant de trois tables

J'ai une question maintenant:

SELECT m.name, m.zipcode, p.lat, p.lon, meta.meta_value 
FROM members AS m 
INNER JOIN zipcodes AS p ON m.zipcode = p.zipcode 
INNER JOIN usermeta AS meta ON m.id = meta.id 
WHERE m.zipcode = p.zipcode AND meta.meta_key = 'image' m.country = "USA" 

m.id et meta.id n'existent pas pour tous.

Pour ceux qui ont m.id, "image" n'existe pas pour tous.

Je veux tirer les données des 2 autres tables indépendamment de l'existence de "image" et m.id.

Comment puis-je faire cela?

Répondre

0

Que diriez-vous de changer la requête

SELECT m.name, m.zipcode, p.lat, p.lon, meta.meta_value 
FROM members AS m 
INNER JOIN zipcodes AS p ON m.zipcode = p.zipcode 
LEFT OUTER JOIN usermeta AS meta ON m.id = meta.id 
WHERE m.zipcode = p.zipcode AND COALESCE(meta.meta_key,'image')='image' AND m.country = 'USA' 
+0

Merci! Mieux, mais toujours pas correct! :-(J'obtiens environ 218 lignes de 313. – Helge

+0

pas correct? Quelles lignes sont omises? Essayez coalesce toutes les colonnes dans la clause where: WHERE COALESCE (meta.meta_key, 'image') = 'image' ET COALESCE (m.country, 'USA') = 'USA' (notez que j'ai supprimé m.zipcode = p.zipcode car déjà écrit dans la clause ON) – YudhiWidyatama

+0

Même résultat après ce changement! Peut-il avoir quelque chose à voir avec le fait que tous les utilisateurs n'ont pas un m.id qui correspond au meta.id? Certains utilisateurs n'existent que dans la table des membres, mais ils n'ont pas ce type particulier d'ID, s'ils n'ont pas de member.id, ils ne le font pas non plus. avoir un méta-code – Helge

1

Vous utilisez INNER JOINs; utilisez OUTER JOINS pour obtenir des valeurs NULL dans les colonnes des tables jointes où la condition est false.

Par exemple:

SELECT m.name, m.zipcode, p.lat, p.lon, meta.meta_value 
FROM members AS m 
LEFT OUTER JOIN zipcodes AS p ON m.zipcode = p.zipcode 
LEFT OUTER JOIN usermeta AS meta ON m.id = meta.id 
WHERE m.zipcode = p.zipcode AND meta.meta_key = 'image' m.country = "USA" 
+0

Merci Julio, mais cela donne exactement la même sortie que la requête ci-dessus! – Helge

+0

@Helge Je sais mais maintenant vous avez des valeurs NULL afin que vous puissiez "jouer" avec votre expression de condition WHERE pour obtenir vos données par exemple 'A IN (valeur_value1, valeur_valable2, ..., valeur nulle)' –

Questions connexes