在我的情况下,它是权限和角色所以我将结果与union all结合起来 我只是想检查条件,如果用户权限值= 0然后选择其他我正在尝试这样的
SELECT username, orgId, uid, pid, perm FROM (
SELECT users.username, users.orgId, user_roles.uid, role_perms.pid, role_perms.value AS perm
FROM user_roles INNER JOIN role_perms
ON (user_roles.rid = role_perms.rid) INNER JOIN user_users ON(user_roles.uid = users.uid) WHERE role_perms.pid = 9 AND users.orgId = 2 AND users.username IS NOT NULL AND users.username != ''
UNION ALL
SELECT users.username, users.orgId, user_perms.uid, user_perms.pid, user_perms.value AS perm
FROM user_perms INNER JOIN users ON(user_perms.uid = users.uid) WHERE user_perms.pid = 9 AND user_users.orgId = 2 AND user_users.username is not null and user_users.username != '') AS combPerm;
它给出结果,好像在user_perm表中拒绝了一个用户的权限,但该用户也有包含特定权限的角色
username | orgId | uid | pid | perm
abc@a.com 2 11 9 0
abc@a.com 2 11 9 1
xyz@a.com 2 91 9 1
dvc@a.com 2 88 9 1
结果我想abc@a.com只有一次,如果它有来自user_perms表的perm 0而所有其他记录都相同,那么所需的结果是
username | orgId | uid | pid | perm
abc@a.com 2 11 9 0
xyz@a.com 2 91 9 1
dvc@a.com 2 88 9 1
答案 0 :(得分:2)
您可以点击min(perm)
并在您的查询中添加一个分组
SELECT username, orgId, uid, pid, min(perm) FROM (
-----the rest of the query
) AS combPerm group by username, orgId, uid, pid;
答案 1 :(得分:1)
你已经接受了isaace关于如何给予perm 0优先于perm 1的答案。但现在你说,你宁愿给查询2结果优先于查询1结果。
在标准SQL中,这很容易完成。您可以为查询添加排名键(select 1/2 as rankkey, ...
),并使用ROW_NUMBER
对结果进行排名并保持最佳匹配,或者您使用FETCH WITH TIES
执行此操作。< / p>
MySQL既不支持ROW_NUMBER
等窗口函数,也不支持允许绑定的限制子句。许多这样的事情都是用MySQL中的查询中的变量来解决的。这是另一个技巧:
你所拥有的是像
select username, orgId, uid, pid, perm from table1
union all
select username, orgId, uid, pid, perm from table2;
并且isaace向您展示了如何获得每个用户名的最小烫发,orgId,uid,pid。然而,你想要接近但不同的东西:-)在这里你去:
select username, orgId, uid, pid, max(keyperm) % 10 as perm
from
(
select username, orgId, uid, pid, perm + 10 as keyperm from table1
union all
select username, orgId, uid, pid, perm + 20 as keyperm from table2
)
group by username, orgId, uid, pid
order by username, orgId, uid, pid;
这里有什么乐趣?你看,我在第一个查询中添加了10个烫发,在第二个查询中添加了20个烫发。 MAX
给了我两个中较高的一个,如果两个都存在,则是第二个。我们最终得到一个10或11或20或21的烫发。操作%10(模10)移除了10的位置并且只保留了1或0的位置,烫发。
(如果烫发可以是两位数,添加100和200并使用%100,如果有更多数字......那么你就明白了。)
答案 2 :(得分:0)
SELECT * FROM (YOUR QUERY) t WHERE perm=0 GROUP BY username, orgId, uid,pid;