MYSQL union如果条件匹配则全部有条件选择first else 2nd

时间:2018-03-15 16:24:08

标签: mysql union-all

在我的情况下,它是权限和角色所以我将结果与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

3 个答案:

答案 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;