2013-02-09 55 views
1

好吧,所以我試圖執行一個查詢,它有4個表, 用戶,事件,event_roles,user_event_role。MySQL使用分組來限制結果

用戶可以填寫多個角色。我試圖做的是得到一個看起來更像這樣的結果: 用戶,事件,角色

因此,如果用戶'Bill'與事件'Meeting'和'Bill'相關聯,則會填充多個角色得到這樣的結果:

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

我將如何得到我的結果是這樣的

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

這裏是我試圖建立過的查詢。

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

查詢有什麼問題? – 2013-02-09 21:49:28

回答

3

您尋求的結果是不可能的。

但是也有一些是接近:

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 

這將產生:

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

在您需要調整您的邏輯來正確分析這兩種情況下。

+0

是的,謝謝,剛剛玩group_conact函數,雖然沒有得到我想要的結果是在正確的軌道上,謝謝 – user1620152 2013-02-09 21:54:41

+0

不客氣。 – scones 2013-02-09 21:55:26

1

你不能得到這樣的結果,因爲你不知道有多少角色有可能是(即列數),但你可以使用GROUP_CONCAT這樣:

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 

使用這個查詢,你會得到一切角色與,聯合。但請注意GROUP_CONCAT的限制,默認值設置爲1024個字符,可能不夠(請參閱my.cnf)。

+0

關於字符限制的好提示,我只是得到了role_ids,而group by是非常必要的,因爲沒有它將每個用戶的角色放到一個結果中。 – user1620152 2013-02-09 22:04:22