2013-02-26 18 views
1

的Joomla有三個表:MySQL查詢扁平化的Joomla組成員表

用戶:

id | username 
------------- 
1 | you 
2 | me 

組:

id | title 
------------- 
1 | users 
2 | managers 

usergroups_map:

user_id | group_id 
------------------ 
1  | 2 
2  | 1 
2  | 2 

我想要做的是創建一個查詢(fr看看我將創建一個視圖,以展OM),如:

user_id | username | users | manager 
------------------------------------ 
1  | you  | 0  | 1 
2  | me  | 1  | 1 

到目前爲止,我有這樣的事情:

SELECT u.id, username, group_id, user_id, title 
FROM joomla_users u 
    LEFT JOIN joomla_user_usergroup_map map ON map.user_id = u.id 
    LEFT JOIN joomla_usergroups g ON g.id = map.group_id 
WHERE title = 'Super Users' 

這給了我一個記錄每個組的成員,但我真的想通過將每個組名稱轉換爲值爲0或1的字段來「扁平化」,具體取決於usergroups_map中是否有該用戶的記錄。

有意義嗎?

回答

1

如果羣體是固定的(用戶,經理),你可以使用這樣的事情:

SELECT 
    u.id, 
    u.username, 
    count(case when um.group_id = 1 then 1 end) users, 
    count(case when um.group_id = 2 then 1 end) manager 
FROM 
    user u INNER JOIN usergroups_map um 
    ON u.id = um.user_id 
GROUP BY 
    u.id, u.username 

否則,你需要做的使用這樣的解決方案:

SET @sql = NULL; 
SELECT GROUP_CONCAT(CONCAT('count(case when um.group_id=',id,' then 1 end) ', title)) 
FROM `group` 
INTO @sql; 

SET @sql = CONCAT('SELECT u.id, u.username, ', @sql, ' FROM 
    user u INNER JOIN usergroups_map um 
    ON u.id = um.user_id 
GROUP BY 
    u.id, u.username'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

請參閱小提琴here

如果你需要創建一個視圖,僅修改上面的代碼與此:

SET @sql = NULL; 
SELECT GROUP_CONCAT(CONCAT('count(case when um.group_id=',id,' then 1 end) ', title)) 
FROM `group` 
INTO @sql; 

SET @sql = CONCAT('CREATE VIEW yourview AS SELECT u.id, u.username, ', @sql, ' FROM 
    user u INNER JOIN usergroups_map um 
    ON u.id = um.user_id 
GROUP BY 
    u.id, u.username'); 

DROP VIEW IF EXISTS yourview; 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
+0

jeebus!我認爲這是完美的!就我個人而言,我喜歡沒有固定組的列表的想法。冒着暴露我缺乏MySQl體驗的風險,我該如何使用動態SQL方法創建視圖? – RedBullet 2013-02-26 23:17:42

+0

@RedBullet :)我編輯了我的答案,上面的代碼將創建一個視圖dinamically,但你必須再次執行代碼,每當你修改你的組表 – fthiella 2013-02-27 08:15:24

+0

當我嘗試在我的服務器上運行這個,我得到一個錯誤: 「給予EXECUTE的未知預處理語句處理程序(stmt)」 – RedBullet 2013-02-27 17:05:32