2010-12-10 3 views
2

I ont les tableaux suivants dans MySQL:gauche Joignez-vous à plusieurs tables interrogent

utilisateurs profil taux

Dans la table des utilisateurs, je l'enregistrement suivant:

 
id: 1 
name: John 
status: active 

Profil , Je ai ce qui suit:

 
id: 5 
bio: blah blah blah 
user_id: 1 

Les taux de table est vide, mais contient les champs suivants:

id, rate, and user_id

Je suis en train d'utiliser SQL pour interroger ces tables et afficher des informations sur l'utilisateur, leur profil d'utilisateur (si elles en ont un), et leurs taux (s'il en existe un). SQL J'utilise est la suivante:

SELECT user.name, profile.bio, rate.rate 
FROM user 
LEFT JOIN (profile, rate) ON (user.id = profile.user_id AND user.id = rate.user_id) 
WHERE status = 'active'; 

Le problème ici est que les rendements sql ci-dessus user.name données, mais la profile.bio est nulle, même si il y a un enregistrement user_id correspondant dans le tableau de profil. Il semble que MySQL n'affiche pas les données bio s'il n'y a pas d'enregistrement correspondant pour cet utilisateur dans la table des tarifs.

Si je veux que le SQL affiche le nom de l'utilisateur ainsi que son taux bio et horaire (s'il en existe un), comment procéderais-je? Je suis un peu confus, car je pensais que le SQL ci-dessus devrait fonctionner.

Merci!

Répondre

2
SELECT user.name, profile.bio, rate.rate 
FROM user 
LEFT JOIN profile ON user.id = profile.user_id 
LEFT JOIN rate ON user.id = rate.user_id 
WHERE status = 'active' 

que vous essayez de combiner la logique LEFT JOIN et il se joignait que si vos deux conditions étaient vraies (user.id = profile.user_id AND user.id = rate.user_id).

2

Je ne suis pas au courant de faire plusieurs jointures dans une clause, donc je tr de diviser les jointures, comme ceci:

SELECT user.name, profile.bio, rate.rate 
FROM user 
LEFT JOIN profile ON user.id = profile.user_id 
LEFT JOIN rate ON user.id = rate.user_id 
WHERE status = 'active'; 
0

Votre code original exécutait une jointure gauche sur la table et user la table produite par la jointure croisée de profile et rate.

La jointure croisée de deux tables est le produit cartésien des deux tables. Plus précisément, il produit et non produit des lignes qui proviennent uniquement d'une table. Par conséquent, lorsque cette table jointe croisée est laissée jointe à user et avec cette clause where, vous ne voyez pas le résultat souhaité.

Pour obtenir le résultat souhaité, vous devez effectuer plusieurs jointures à gauche.

Questions connexes