请教一条复杂的sql

fogu 发布于 2013/04/26 14:17
阅读 247
收藏 2

大家好,现在在做一个sso项目,现在有这么一个需求,详述如下:

应用表 appdict (appname,appcode,reg):reg字段代表该应用是否可自由访问,为1时说明该应用需要申请才可访问

用户应用关联表 userapp(userid,appcode):对于需要申请的应用,该表纪录了有权限访问这些应用的用户

黑名单表 blacklist (userid,appcode) :如果想把某用户设置为禁止访问某个应用,就加入黑名单中。


现在我想写一条sql,把appdict的所有纪录都查出来,并且后面跟上一个字段valid,代表一个用户对这些应用的访问权限:1为可以访问,0为不能访问:

sql的逻辑为对于免费的应用,只要该用户对该应用来说不在黑名单表里就可以访问,valid为1,否则为0。

对于收费的应用,如果用户应用关联表里该应用有该用户的使用许可,并且黑名单表里该应用没有禁止该用户,就可以访问,valid为1,否则为0。

我现在写了条sql ,可以实现对于免费的应用都设置valid为1,对于收费的应用,只有有使用权限的才设置valid为1,但我不知道怎么能把对黑名单表的判断也加进去,求指教

我的sql为:

select  
distinct appdict.appregurl as regurl ,'valid' as attr_name,'appregurl' as appregurl,appdict.appurl as appindexurl,'appindex' as appindex,  
if((case   
  when isreg = 0 and appdict.valid=1 then 1   
  when (select count(*) from user_app,uums_user where appdict.appcode = user_app.appcode and user_app.userid=uums_user.id and  user_app.validflag=1 and appdict.valid=1) > 0 then 1   
  else 0 end )=1,'1','0') 'valid'  
from appdict ,uums_user where uums_user.username='?'

加载中
0
f
fogu

楼上的兄弟谢谢,你写的是对的,就是少了对免费应用的黑名单判断

我最后写成了



select  
distinct appdict.appregurl as regurl ,'valid' as attr_name,'appregurl' as appregurl,appdict.appurl as appindexurl,'appindex' as appindex,  
if((case   
  when isreg = 0 and appdict.valid=1 and (select count(*) from blacklist where blacklist.userid=uums_user.id and blacklist.appcode=appdict.appcode)=0 then 1   
  when (select count(*) from user_app,uums_user where appdict.appcode = user_app.appcode and user_app.userid=uums_user.id and user_app.validflag=1 and appdict.valid=1) > 0  and (select count(*) from blacklist where blacklist.userid=uums_user.id and blacklist.appcode=appdict.appcode)=0 then 1   
  else 0 end )=1,'1','0') 'valid'  
from appdict  ,uums_user where uums_user.username='?'

0
吐槽的达达仔
吐槽的达达仔

我看这样写吧~~你把三个表的需要判断的字段拼成一个宽表,然后再一同作处理。

如:

 

select all.*,
case when a.xxx,b.xx,c.xxx then 1
else 0
end  as valid
from(
select * from
appdict a
left join uums_user b
on a.user_id = b.user_id
left join blacklist c
on b.user_id = c.user_id
)

0
黄龍
黄龍

case   
  when isreg = 0 and appdict.valid=1 then 1   
  when (select count(*) from user_app,uums_user where appdict.appcode = user_app.appcode and user_app.userid=uums_user.id and  user_app.validflag=1 and appdict.valid=1) > 0 and (黑名单表的判断) then 1

返回顶部
顶部