2013-02-09 4 views
1

Ok, donc j'essaye d'effectuer une requête qui a 4 tables, utilisateurs, events, event_roles, user_event_role.MySQL en utilisant Group By pour limiter les résultats

Les utilisateurs peuvent remplir plusieurs rôles. Ce que j'essaie de faire est d'obtenir un résultat qui ressemble plus à ceci: Utilisateur, événement, rôle (s)

Donc si l'utilisateur 'Bill' est associé à l'événement 'Meeting' et 'Bill' Remplit plusieurs rôles à la place d'obtenir un résultat comme celui-ci:

user event  role 
-------------------------- 
bill Meeting admin 
bill Meeting director 

comment pourrais-je obtenir mon résultat à être comme ça

user event  role role 
---------------------------------- 
bill Meeting admin director 

Voici une requête que je suis en train de construire à partir de.

Select * 
    FROM `users` u 
LEFT JOIN `event_role` er ON u.user_id = er.user_id 
LEFT JOIN `events` e ON er.event_id = e.event_id 
+0

Quel est le problème avec votre requête? –

Répondre

3

Le résultat recherché n'est pas possible.

Cependant, il y a quelque chose de proche:

SELECT 
    user, 
    event, 
    group_concat(role SEPARATOR ',') as roles 
FROM 
    `users` u 
    LEFT JOIN `event_role` er 
    ON u.user_id = er.user_id 
    LEFT JOIN `events` e 
    ON er.event_id = e.event_id 
GROUP BY u.user_id 

qui donnerait:

user event  roles 
---------------------- 
bill Meeting admin,director 

Dans les deux cas, vous devrez ajuster votre logique pour analyser correctement.

+0

Yep merci, je jouais juste avec la fonction group_conact et bien que je n'obtenais pas le résultat que je voulais était sur la bonne voie, merci – user1620152

+0

vous êtes les bienvenus. – scones

1

Vous ne pouvez pas obtenir ce résultat, parce que vous ne savez pas combien de rôles qu'il pourrait y avoir (c.-à-colonnes comptent), mais vous pouvez utiliser GROUP_CONCAT cette façon:

SELECT *, 
GROUP_CONCAT(event_roles.role SEPARATOR ',') as roles 
FROM users 
LEFT JOIN event_role USING(user_id) 
LEFT JOIN events USING(user_id) 
GROUP BY user_id 

En utilisant cette requête, vous obtiendrez tous rôles concatonés avec ,. Mais soyez conscient de la limitation de GROUP_CONCAT, la valeur par défaut est définie à 1024 caractères, ce qui peut ne pas être suffisant (voir my.cnf).

+0

Bon conseil sur la limite de char, je reçois juste les role_ids, et le groupe par était très nécessaire car sans cela il met les rôles pour chaque utilisateur dans un résultat. – user1620152