SQLITE数据库表的一个字段中存有另一个表的多个字段,如何查询出来?
表[users]u_idu_useru_gid1admin1,2#用户admin在组“超级”和自动编号用户名所在组ID“低级”中表[group]g_idg_nameg_p...
表[users]
u_id u_user u_gid 1 admin 1,2 #用户admin在组“超级”和
自动编号 用户名 所在组ID “低级”中
表[group]
g_id g_name g_pow 1 超级 13 #组包含 吃、玩的权限
自动编号 组名 包含权限 2 低级 2 #组包含 喝的权限
表[power]
p_id p_name 1 吃
自动编号 权限名 2 喝
3 玩
我如何用SQL语句查出admin的所有权限???
或者有更好的权限的设计办法?就针对这个的,不要复制谢谢。。 展开
u_id u_user u_gid 1 admin 1,2 #用户admin在组“超级”和
自动编号 用户名 所在组ID “低级”中
表[group]
g_id g_name g_pow 1 超级 13 #组包含 吃、玩的权限
自动编号 组名 包含权限 2 低级 2 #组包含 喝的权限
表[power]
p_id p_name 1 吃
自动编号 权限名 2 喝
3 玩
我如何用SQL语句查出admin的所有权限???
或者有更好的权限的设计办法?就针对这个的,不要复制谢谢。。 展开
2个回答
展开全部
$ sqlite3
SQLite version 3.7.7 2011-06-23 19:49:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table users
...> (
...> u_id int,
...> u_user varchar(32),
...> u_gid varchar(32)
...> );
sqlite>
sqlite> create table groups
...> (
...> g_id int,
...> g_name varchar(32),
...> g_pow varchar(32)
...> );
sqlite>
sqlite> create table power
...> (
...> p_id int,
...> p_name varchar(32)
...> );
sqlite>
sqlite> insert into users values (1, 'admin', '1,2');
sqlite>
sqlite> insert into groups values (1, '超级', '1,3');
sqlite> insert into groups values (2, '低级', '2');
sqlite>
sqlite> insert into power values (1, '吃');
sqlite> insert into power values (2, '喝');
sqlite> insert into power values (3, '玩');
sqlite>
sqlite> .head on
sqlite>
sqlite> select *
...> from users, groups, power
...> where 1=1
...> and like(
...> '%,'||g_id||',%',
...> ','||u_gid||','
...> )
...> and like(
...> '%,'||p_id||',%',
...> ','||g_pow||','
...> )
...> ;
u_id|u_user|u_gid|g_id|g_name|g_pow|p_id|p_name
1|admin|1,2|1|超级|1,3|1|吃
1|admin|1,2|1|超级|1,3|3|玩
1|admin|1,2|2|低级|2|2|喝
sqlite>
SQLite version 3.7.7 2011-06-23 19:49:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table users
...> (
...> u_id int,
...> u_user varchar(32),
...> u_gid varchar(32)
...> );
sqlite>
sqlite> create table groups
...> (
...> g_id int,
...> g_name varchar(32),
...> g_pow varchar(32)
...> );
sqlite>
sqlite> create table power
...> (
...> p_id int,
...> p_name varchar(32)
...> );
sqlite>
sqlite> insert into users values (1, 'admin', '1,2');
sqlite>
sqlite> insert into groups values (1, '超级', '1,3');
sqlite> insert into groups values (2, '低级', '2');
sqlite>
sqlite> insert into power values (1, '吃');
sqlite> insert into power values (2, '喝');
sqlite> insert into power values (3, '玩');
sqlite>
sqlite> .head on
sqlite>
sqlite> select *
...> from users, groups, power
...> where 1=1
...> and like(
...> '%,'||g_id||',%',
...> ','||u_gid||','
...> )
...> and like(
...> '%,'||p_id||',%',
...> ','||g_pow||','
...> )
...> ;
u_id|u_user|u_gid|g_id|g_name|g_pow|p_id|p_name
1|admin|1,2|1|超级|1,3|1|吃
1|admin|1,2|1|超级|1,3|3|玩
1|admin|1,2|2|低级|2|2|喝
sqlite>
追问
你好啊,有没有更好的数据库设计办法去管理权限?
追答
将关系从主表中剥离出来,单独成表:
create table users
(
u_id int,
u_user varchar(32)
);
create table groups
(
g_id int,
g_name varchar(32)
);
create table power
(
p_id int,
p_name varchar(32)
);
create table rl_user_group
(
u_id int,
g_id int
);
create table rl_group_power
(
g_id int,
p_id int
);
insert into users values (1, 'admin');
insert into groups values (1, '超级');
insert into groups values (2, '低级');
insert into power values (1, '吃');
insert into power values (2, '喝');
insert into power values (3, '玩');
insert into rl_user_group values (1,1);
insert into rl_user_group values (1,2);
insert into rl_group_power values (1,1);
insert into rl_group_power values (1,3);
insert into rl_group_power values (2,2);
.head on
select *
from users u
join rl_user_group ug on u.u_id = ug.u_id
join groups g on g.g_id = ug.g_id
join rl_group_power gp on g.g_id = gp.g_id
join power p on p.p_id = gp.p_id
;
-- 单行用户的权限文字列表:
SELECT u.*, GROUP_CONCAT(p_names) as p_names
FROM users u
JOIN rl_user_group ug on u.u_id = ug.u_id
JOIN (
SELECT gp.g_id,
GROUP_CONCAT(p_name) as p_names
FROM power p
JOIN rl_group_power gp on p.p_id = gp.p_id
GROUP BY gp.g_id
) as gp on ug.g_id = gp.g_id
GROUP BY u.u_id
;
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询