2010-03-18 12 views
0

Dans mysql sélection im d'Cries tableau ayant une clé étrangère à une autre table appelée « roleuser » avec la colonne correspondante comme user_idmontrant des lignes nulles en utilisant rejoindre

maintenant la colonne user_id dans la table des cris pour certaines lignes est nulle (pas vraiment nulle, mais sans inserts dans mysql)

Comment afficher toutes les lignes de la table soit avec des cris user_id nulle ou non

Je suis d'exécuter l'instruction SQL

SELECT s.*, r.firstname, r.lastname 
FROM shouts s left join roleuser r where r.user_id = s.user_id limit 50; 

qui ne exécute et montre

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where r.user_id = s.user_id limit 50' at line 2 

mais en utilisant la jointure SQL exécute qui montre les lignes qui n'ont des valeurs user_id dans la table des cris. les zéros ne sont pas affichés.

SELECT s.*, r.firstname, r.lastname 
FROM shouts s inner join roleuser r where r.user_id = s.user_id limit 50; 

Comment puis-je montrer toutes les lignes de la table des cris et des valeurs nulles dans les colonnes et prenom lastname où le user_id est nul dans la table des cris. Si pas possible avec SQL peuvent utiliser des procédures stockées ...

Merci

Pradyut

Répondre

2

Vous voulez une clause ON dans la jointure.

SELECT s.*, r.firstname, r.lastname 
FROM roleuser r 
    LEFT JOIN shouts s 
    ON s.user_id = r.user_id 
WHERE 
    r.firstname like '%byron%' -- where clause goes here.. 

LIMIT 50; 
+0

merci pour la réponse rapide éclair ... –

+0

Est-ce que cette adresse "Comment montrer toutes les lignes de la table de cris soit avec user_id nul ou pas" - voir ma réponse ci-dessous. –

+0

"Vous voulez une clause ON dans votre jointure" - ou bien le qualificatif "NATURAL". – onedaywhen

2

On dirait que vous voulez

SELECT s.*, r.firstname, r.lastname 
FROM shouts s left join roleuser r ON r.user_id = s.user_id limit 50; 

que vous utilisiez WHERE au lieu de ON.

Votre deuxième requête a fonctionné parce que

SELECT s.*, r.firstname, r.lastname 
FROM shouts s inner join roleuser r where r.user_id = s.user_id limit 50; 

arrive juste pour donner les mêmes résultats que

SELECT s.*, r.firstname, r.lastname 
FROM shouts s inner join roleuser r ON r.user_id = s.user_id limit 50; 

même si elles signifient des choses légèrement différentes. Pour une INNER JOIN, le ON est facultatif et si vous le laissez, vous obtenez le produit cartésien de toutes les lignes de la première table et de toutes les lignes de la deuxième table, alors votre clause WHERE filtre toutes les lignes non concordantes. Si vous placez la condition dans la clause ON à la place, la jointure évalue uniquement les lignes correspondantes et vous n'avez pas besoin de mettre une condition dans votre clause WHERE. Dans les deux cas, les résultats sont identiques pour une jointure interne.

Toutefois, une jointure externe n'a pas d'équivalent de clause WHERE, de sorte que sa clause ON n'est pas facultative.

+0

merci pour la réponse rapide éclair ... –

Questions connexes