2011-10-10 5 views
1

J'essaie d'obtenir une requête MySQL pour me donner des données relatives à 2 tables. Ainsi, un utilisateur aurait accès à 2 projets, avec un total de 3 messages (dans "stream"). Essentiellement, je veux obtenir les projets associés dans project_users et ensuite obtenir des messages dans le flux associé à ces projets.Requête MySQL dans 3 tables

Les données ressemble à ceci:

Tableau 1: l'utilisateur (1 utilisateur identifié par 'id')

Tableau 2: project_users (utilisateur associé à 2 projets dans ce cas)

Tableau 3: flux (messages attachés à différents projets, mais je devrais obtenir 3 sur la base de mon jeu de données de test)

requête mon (cassé) ressemble à ceci:

SELECT U.`id`, P.`kf_users`, P.`kf_projects`, S.`kf_projects`, S.`body` 
    FROM users U 
    LEFT JOIN projects_users P ON U.`id` = P.`kf_users` 
    LEFT JOIN stream S ON P.`kf_users` = S.`kf_projects` 
    WHERE U.`id` = 1 

Que diable suis-je manque? J'ai essayé des sous-requêtes, mais cela ne m'a pas permis d'avoir plusieurs lignes, ce qui rendait cela inutile dans la forme que j'avais.

Merci!

+0

est 'U.kp_user' dans la clause' WHERE' la colonne correcte (pas supposée être simplement 'U.id')? (Je n'ai pas de schéma, donc c'est juste une supposition.) –

+0

Désolé, c'était une faute de frappe. Toujours pas de chance cependant! –

+0

Vous devez fournir le schéma. Comment la requête est-elle brisée? – Pepe

Répondre

2

Je reçois aucun résultat une fois que je tente cette requête

Vraiment ?! Ensuite, essayez de le changer à ceci:

SELECT * 
FROM users U 
WHERE id = 1 

Je suppose que cela ne vous donnera pas de résultats aussi. Sachant que cette requête échoue également devrait vous aider à trouver le problème plus rapidement (vous n'avez pas un utilisateur avec l'ID 1).

Remarque: Si cela vous donne un résultat, la requête que vous avez postée ci-dessus avec LEFT JOIN devrait également renvoyer des lignes, car l'ajout d'un LEFT JOIN ne doit pas supprimer les lignes.


Mise à jour: Essayez d'ajouter des alias pour rendre les noms de colonnes uniques:

SELECT 
    U.id, 
    P.kf_users, 
    P.kf_projects AS p_kf_projects, 
    S.kf_projects AS s_kf_projects, 
    S.body 
FROM .... 
+0

Vous avez certainement obtenu un résultat pour la requête que vous avez donnée. Je l'ai également rejoint à la table projects_users et j'ai obtenu des résultats. (SELECT U.'id', P.'kf_users', P.'id' FROM utilisateurs U LEFT JOIN projets_users P SUR U.'id' = P.'kf_users' O WH U.'id' = $ id) Mais c'est ne donnera toujours aucun résultat si j'utilise la requête originale que j'ai posté ci-dessus. –

+1

@Rylan Dirksen: L'ajout d'un LEFT JOIN ne supprime pas les lignes. Il doit y avoir une erreur. Envoyez-vous la requête de PHP? Avez-vous inspecté la valeur de retour de mysql_query et (si nécessaire) mysql_error? Pouvez-vous poster votre code exact? –

+0

Merci de m'avoir aidé à repenser ma requête. Je l'ai reconstruit à partir de rien et j'ai découvert que je sélectionnais sur la mauvaise table. –

0

Alors je me suis dit ce que je fait de mal. Je rejoignais de la table des utilisateurs auparavant, ce qui n'était pas nécessaire puisque mon script PHP a déjà l'ID utilisateur.

Au lieu de cela, je me suis joint de la table projects_users et a pris des références à la table des utilisateurs:

SELECT S.* 
    FROM projects_users P 
    LEFT JOIN stream S ON P.`kf_projects` = S.`kf_projects` 
    WHERE P.`kf_users` = '1'; 

... et cela a fonctionné comme un charme. Merci à tous pour votre aide!