原文:http://blog.csdn.net/java85140031/article/details/6820699
問題:
userId role_name role_id
1 管理員 1
1 編輯 2
1 超級管理員 3
2 普通會員 4
3 高級會員 5
4 null null
很簡單的數據,就是一個用戶可能會對應多個角色,現在要求能用程序或者sql的方式用戶和角色逗號進行分割。要求得到的數據如下:
userId role_name
1 管理員,編輯,超級管理員
2 普通會員
3 高級會員
4 null
解答:
用程序估計是再簡單不過了,數據庫的話如下:
MySQL:直接調用函數group_contact完成
oracle10g:直接掉函數wm_concat完成
oracle9i:麻煩點,不過主要是通過sys_connect_by_path,這個函數能樹枝進行按指定字符連接,之所以產生樹是因為這里面用到了Oracle的START WITH 遞歸成樹的
(1) MySQL
group_concat函數是典型的字符串連接函數,下面就為您介紹MySQL group_concat的語法,希望對您學習
MySQL group_concat函數有所幫助。
MySQL group_concat函數
完整的語法如下:
group_concat([DISTINCT] 要連接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])
我的理解就是: 后面的 group by xx 分好組之后, 然后將組內的數據連接起來,默認是逗號
測試sql語句:
1 insert into role VALUES(1,1,'管理員',1); 2 insert into role VALUES(2,1,'編輯',2); 3 insert into role VALUES(3,1,'超級管理員',3); 4 insert into role VALUES(4,2,'普通會員',4); 5 insert into role VALUES(5,3,'高級會員',5);
例子:
select userId,group_concat(role_name,';') from role group by userId;
result:
1 管理員;,編輯;,超級管理員;
2 普通會員;
3 高級會員;
擴展:
如果ORALCE\MYSQL本身有提供這字符串連接聚合函數的話,樓主這個問題,其實很容易解決的,即按USERID分組后,再將同組的role_name進行字符串連接就OVER。
像ORALCE中wm_concat函數還不是ORACLE所有版本都有的,而像這種字符連接函數在實際編程中,是很常用的,SELECT CATSTR(role_name) FROM USER GROUP BY USERID,而這邊這個 CATSTR聚合函數是自己在數據庫PL/SQL實現的,具體實現方式可參見http://hi.baidu.com/xoy2129/blog/item/c7885e66a201f125ab184cea.html
這樣CATSTR就具有通用性了
也就是自定義函數
參見另外一篇: oracle中用戶自己創建與調用聚合函數
