Mysql 向查询添加第二个联接会使值重复
我有一个返回用户信息的sql查询,将他的权限与另一个注册了他的角色权限的表连接起来:Mysql 向查询添加第二个联接会使值重复,mysql,sql,group-by,duplicates,aggregate-functions,Mysql,Sql,Group By,Duplicates,Aggregate Functions,我有一个返回用户信息的sql查询,将他的权限与另一个注册了他的角色权限的表连接起来: SELECT U.*, array_agg(RP.permission) as permission FROM user U JOIN role_permissions RP ON RP.role = F.role WHERE U.email=$1 GROUP BY U.cpf -- U.cpf is the primary key 这返回了以下结果: { cpf: '11111111111', ro
SELECT U.*, array_agg(RP.permission) as permission
FROM user U
JOIN role_permissions RP ON RP.role = F.role
WHERE U.email=$1
GROUP BY U.cpf -- U.cpf is the primary key
这返回了以下结果:
{
cpf: '11111111111',
role: 'c-level',
area: 'Administrativo Financeiro',
...,
permission: [
'can_edit_all_metrics',
'can_edit_all_plans',
'can_view_all_metrics',
'can_generate_reports',
...
]
}
现在我尝试将他有权访问的区域添加到查询中,并尝试使用以下查询:
SELECT U.*, array_agg(RP.permission) as permission,
array_agg(AC.has_access_to) as areas_with_access
FROM user U
JOIN role_permissions RP ON RP.role = F.role
JOIN area_access AC ON AC.area = U.area
WHERE U.email=$1
GROUP BY U.cpf
我得到的结果是:
{
cpf: '11111111111',
role: 'c-level',
area: 'Administrativo Financeiro',
...,
permission: [
'can_edit_all_metrics',
'can_edit_all_metrics',
'can_edit_all_plans',
'can_edit_all_plans',
'can_view_all_metrics',
'can_view_all_metrics',
'can_generate_reports',
'can_generate_reports',
...
],
areas_with_access: [
'Financeiro',
'Test',
'Financeiro',
'Test',
'Financeiro',
'Test',
'Financeiro',
'Test',
...,
]
}
我已经尝试过左/右加入第二个表,将AC.area和AC.has\u access\u添加到GROUPBY子句中,但什么也没有发生。
通过将RP.permission添加到组中,使其仅返回两个权限,因为他只有两个可以访问的区域
我可以只向聚合函数添加DISTINCT
,但我想知道是否有什么地方我做错了
这是角色权限表:
create table if not exists role_permissions (
role character varying(50),
permission character varying(50),
constraint pk_role_permissions primary key (role, permission),
constraint fk_role_permissions_role foreign key (role) references roles(role) on update cascade on delete cascade,
constraint fk_role_permissions_permission foreign key (permission) references permissions(permission) on update cascade on delete cascade,
);
这是区域访问表:
create table if not exists area_access (
area character varying(50) NOT NULL,
has_access_to character varying(50) NOT NULL,
constraint pk_area_access primary key (area, has_access_to),
constraint fk_area foreign key (area) references area(area) on update cascade on delete cascade,
constraint fk_has_access_to foreign key (has_access_to) references area(area) on update cascade on delete cascade,
constraint ck_area_different CHECK (area != has_access_to)
);
@RiggsFolly所以在这种情况下我必须使用
DISTINCT
?