2010-10-19 4 views
1

je renonce pour l'instant avec mon JOIN créer une vue pour des raisons de recherche - je besoin d'aide:/MySQL JOIN avec 3 tables et lignes vides

Voici mes tableaux:

Profils

id company user_id 
1 ACME  2 
2 Joe  4 
3 Wolf  5 

utilisateurs

id role_id online 
2 4   2010-10-08 
4 2   2010-10-08 
5 4   2010-10-08 

Rubrics

id title 
1  Steel 
2  Stone 
3  Wood 

Profiles_Rubrics

profile_id rubric_id 
1   1 
1   2 
2   3 
2   1 

Ce que je veux obtenir de ces tables est une vue avec une ligne pour chaque profil - y compris aussi les profils qui ont aucune entrée dans le HABTM Profiles_Rubrics. Pour l'instant je ne peux obtenir les profils qui ont des entrées dans la table HABTM:

CREATE OR REPLACE VIEW Catalog_Branches AS 
SELECT 
    profiles.id, 
    profiles.company, 
    GROUP_CONCAT(DISTINCT CAST(rubrics.id AS CHAR) SEPARATOR ', ') AS rubric, 
    GROUP_CONCAT(DISTINCT CAST(rubrics.title AS CHAR) SEPARATOR ', ') AS rubric_title, 
    profiles.user_id 
FROM 
    profiles, 
    profiles_rubrics 
    JOIN rubrics ON profiles_rubrics.rubric_id=rubrics.id, 
    users 
WHERE 
    profiles_rubrics.profile_id=profiles.id 
    AND profiles_rubrics.rubric_id=rubrics.id 
    AND users.id=profiles.user_id 
    AND users.profile_online IS NOT NULL 
    AND users.role_id!=1 
GROUP BY 
    profiles.id 

Je l'ai essayé avec l'aide d'autres réponses ici à stackoverflow, mais ne peut pas arriver au point où il retourne tous les profils. Je ne suis pas un grand expert MySQL comme on pourrait le voir de tout ce qui précède :)

Répondre

3

Vous devez faire usage de JOINT GAUCHE.

Quelque chose comme

SELECT 
    profiles.id, 
    profiles.company, 
    GROUP_CONCAT(DISTINCT CAST(rubrics.id AS CHAR) SEPARATOR ', ') AS rubric, 
    GROUP_CONCAT(DISTINCT CAST(rubrics.title AS CHAR) SEPARATOR ', ') AS rubric_title, 
    profiles.user_id 
FROM 
    profiles LEFT JOIN 
    profiles_rubrics ON profiles_rubrics.profile_id=profiles.id LEFT JOIN 
    rubrics ON profiles_rubrics.rubric_id=rubrics.id LEFT JOIN 
    users ON users.id=profiles.user_id 
WHERE 
    users.profile_online IS NOT NULL 
    AND users.role_id!=1 
GROUP BY 
    profiles.id 

Jetez un oeil à SQL Joins

+0

+1 Astander: ressemble le lien aux utilisateurs pourrait être une INNER JOIN sans supprimer les profils? – richaux

+0

C'est génial et fonctionne comme prévu! Merci beaucoup! Je ne savais pas que vous pouvez avoir concaténé (?) JOINs comme vous l'avez fait. Et essayer par erreur est très difficile avec cette grosse requête :) Je vais maintenant l'appliquer à une autre VIEW que je crée! –

+0

btw il y a une faute de frappe dans la clause WHERE: le premier ET va échouer la requête - ne sais pas si vous pouvez corriger cela pour les utilisateurs à venir en utilisant votre réponse. –