2013-10-24 69 views
1

对不起,对于那些MySQL或SQL大师来说,这可能是一个微不足道的问题。我有3个表:跨多个表的MySQL查询问题

  • 用户
  • 安全

安全有一个像几个层次:来宾,标准用户,管理员等,这是一个整数值。所以基本上一个客人是0,标准是1,管理员是10.

每个用户都有一个安全ID在安全表中查找。

每个页面都有一个安全ID,用于查找给定用户可以看到哪个页面。

我想创建一个使用当前用户名的查询,返回此用户可以看到的页面。因此,基本上返回安全级别小于或等于用户安全级别的所有页面。但是我并没有将每个表中的级别存储在安全表唯一入口的ID中。

我重视我的数据库架构的截图,因为它代表:

DB Schema

样本数据:

用户表: users table data

页表:

pages table data

安全表:

security table data

+0

所以security.level必须是该表<=什么柱? – Mihai

+1

页面的安全级别必须小于用户的安全级别。但是在页面和用户表中,我们存储了安全级别而不是级别,安全级别由每个表中的ID查找。我可以修改结构,只是为了保持关系数据库的模块化和一致性。 –

回答

0
SELECT p.name FROM users u JOIN security s ON u.security_id=s.id 
     JOIN pages p ON s.id=p.security_id where u.username='currentUser' 
AND (SELECT level from security s JOIN users u on s.id=u.security_id where u.username='currentUser' GROUP BY level) >= (SELECT level from security s JOIN pages p on s.id=p.security_id JOIN users u on s.id=u.security_id where u.username='currentUser' GROUP BY level) 
+0

我应该澄清一下,但是这取决于安全ID,这很好,但安全表内部是一个int int值。我想返回所有安全级别小于或等于用户当前安全级别的页面。 –

+0

用户的安全级别在哪里? – Mihai

+0

安全表内部存储该级别。在稍后添加不同安全级别的情况下,users表存储id而不是级别。所以基本上用户存储安全表中的id为security_id,但是在安全表中存储关卡 –

0

试试这个

select 
    p.name 
from 
    pages p, 
    security s, 
    users u 
where u.security_id = s.id 
    and p.security_id = s.id 
    and u.username = 'someuser' 
+0

这将返回具有相同ID的所有页面。但是,我期待根据security.level返回用户可以看到的页面列表。所以返回的页面是<=用户的security.level而不是security.id如果有意义 –

+0

我已经编辑了这个问题,如果有帮助。谢谢! –