2010-04-11 3 views
0

Hé les gars question rapide, j'utilise toujours la jointure gauche, mais quand je suis parti rejoindre deux fois, je reçois toujours des résultats amusants, généralement des doublons. Je travaille actuellement sur une requête qui Left joints deux fois pour récupérer les informations nécessaires nécessaires mais je me demandais s'il était possible de construire une autre instruction select alors je n'ai pas besoin de deux jointures gauche ou deux requêtes ou s'il y avait une meilleure façon . Par exemple, si je pouvais sélectionner topic.creator dans table.topic en premier quelque chose comme AS, alors je pourrais sélectionner cette variable dans les utilisateurs et à gauche joindre table.scrusersonline. Merci d'avance pour tout conseil.Besoin d'une alternative à deux jointures gauche

SELECT * FROM scrusersonline 
    LEFT JOIN users ON users.id = scrusersonline.id 
    LEFT JOIN topic ON users.username = topic.creator 
WHERE scrusersonline.topic_id = '$topic_id' 

Le point entier de cette requête est de vérifier si le topic.creator est en ligne en récupérant son nom table.topic et correspondant à sa carte d'identité dans table.users, puis de vérifier s'il est en table.scrusersonline. Il produit malheureusement des entrées en double et est donc inexact dans mon esprit.

+0

Deux gauches font un droit. –

+0

@Scarface, veuillez prendre soin de bien formater votre code. Cela permet aux autres de vous aider plus facilement. –

+0

Veuillez donner un exemple des entrées en double. Il ne devrait pas y avoir plusieurs entrées sauf s'il y a vraiment plusieurs enregistrements. Utiliser distinct peut résoudre cela à moins que les enregistrements ne soient pas réellement dupliqués. – Don

Répondre

1

Une option est de regrouper vos rejoint ainsi:

SELECT * 
    FROM scrusersonline 
    LEFT JOIN (users ON users.id = scrusersonline.id 
      JOIN topic ON users.username = topic.creator) 
WHERE scrusersonline.topic_id = '$topic_id' 
+0

L'imbrication de votre jointure est-elle correcte? La clause 'ON users.id = scrusersonline.id' doit être en dehors des parenthèses, n'est-ce pas? –

1

Essayez:

select * from topic t 
    left outer join (
     users u 
     inner join scrusersonline o on u.id = o.id 
    ) on t.creator = u.username 

Si o.id est nul, l'utilisateur est hors ligne.

2

Vous utilisez un LEFT JOIN lorsque vous souhaitez récupérer des données indépendamment. Dans ce cas, si le créateur est hors ligne, ne pas récupérer les lignes serait une bonne indication - alors supprimez les jointures LEFT et faites simplement des jointures régulières.

SELECT * 
    FROM scrusersonline AS o 
    JOIN users AS u ON u.id = o.id 
    JOIN topic AS t ON u.username = t.creator 
WHERE o.topic_id = '$topic_id' 
+0

Je reçois toujours mon nom d'utilisateur imprimé deux fois si je fais écho aux résultats. Je suppose que c'est ok car je veux juste un nombre de lignes, mais quelle est la différence dans les jointures, ils semblent tous fonctionner de la même manière indépendamment. – Scarface

+2

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html –

+0

bel article merci cp, qui efface vraiment les choses – Scarface

0

Ne serait-il préférable de match contre topic_id dans le tableau topics en déplaçant la condition à la jointure. Je pense que cela va résoudre votre problème, puisque les doublons viennent de se joindre à la table topics:

SELECT * FROM scrusersonline 
    JOIN users 
    ON users.id = scrusersonline.id 
    LEFT JOIN topic 
    ON scrusersonline.topic_id = '$topic_id' 
     AND users.username = topic.creator 

Par ailleurs, LEFT JOIN avec users n'est pas nécessaire puisque vous semblez rechercher l'intersection entre scrusersonline et users

Questions connexes