2009-04-12 5 views
0

J'ai cette requête et j'ai besoin d'inclure une autre jointure sur une table appelée "likes" où updates.id = likes.update_id. Il y aura 0 ou plusieurs correspondances sur cette jointure. Ceci est probablement assez simple, mais je n'ai pas trouvé d'exemples pour ce genre de requête.MYSQL un à plusieurs JOIN

La situation est essentiellement que j'affiche une liste d'éléments. Je fais une jointure sur la table des utilisateurs pour récupérer l'utilisateur qui a créé chaque élément. J'ai également besoin de faire une jointure sur les tables "j'aime" pour afficher les 0+ personnes qui ont aimé chaque élément.


EDIT: Ma solution

Ok, voici le succès et rejoindre la combinaison des résultats en double (en raison du fait qu'il ya plusieurs « aime » pour chaque mise à jour) à l'aide GROUP_CONCAT.

"SELECT users.*,updates.update_id,updates.content,updates.status_time, 
GROUP_CONCAT(likes.liker SEPARATOR ',') AS liked_by 
FROM updates 
LEFT OUTER JOIN likes ON updates.update_id = likes.update_id 
JOIN users ON users.remote_id = updates.owner_id 
GROUP BY updates.update_id 
ORDER BY updates.status_time DESC 
LIMIT 200" 
+0

vous prétendez être commander par updates.time, mais il n'y a pas de champ 'time' dans le resu lt - qu'est-ce qui donne là? –

+0

En outre, il serait utile d'avoir la liste complète des colonnes pour chacune des trois tables. S'il existe une colonne users.id ainsi qu'une colonne updates.id, il se peut que vous voyiez uniquement users.id même si la jointure se trouve sur updates.id (l'un des principaux problèmes avec les noms de colonnes non uniques). –

+0

Ouais, les noms de colonnes non-uniques causaient ma confusion. Je l'ai compris et mis à jour le message original avec la solution. Merci! – makeee

Répondre

2
SELECT * FROM users 
LEFT OUTER JOIN updates ON users.remote_id=updates.owner_id 
INNER JOIN likes ON <join condition here> 
ORDER BY updates.time DESC LIMIT 50 

Est-ce que le travail?

Si non, pouvez-vous préciser quelle est exactement votre question? Est-ce que la requête ne fonctionne pas?

+0

S'il y a zéro ou plusieurs correspondances, pensez à "LEFT OUTER JOIN". – dkretz

+0

Ah. Cela a plus de sens, alors. – Kalium

+0

Voir ma modification dans le message principal. Faites-moi savoir si cela n'est pas clair. Je suis un peu fatigué .. – makeee

1

si vous avez 1 à n relation, vous devez utiliser l'un LEFT JOIN, je veux dire s'il y a seulement 1 utilisateur et beaucoup likes.user_id vous devriez doIT avec la manière suivante

« SELECT * FROM utilisateurs LEFT JOIN mises à jour sur (users.remote_id = updates.owner_id) ORDER BY updates.time DESC LIMIT 50"

cette façon, vous obtiendrez toutes les mises à jour à partir d'un certain utilisateur :)

acclamations

Questions connexes