我有5张桌子:
user ( user id, user name, etc.. )
role ( role_id, role_name )
user_role ( user_id, roles_id )
form ( form_id, form_name, etc.. )
form_access ( form_id, role_id )
user
包含所有已注册的用户数据。 role
包含所有不同类型的角色。 user_role
包含哪个用户具有哪个角色(存储了所有已分配的角色)form
包含所有表单数据。 form_access
包含哪些用户角色具有哪种表单访问权限的数据(一种表单可以分配给许多用户角色)。我想在PHP中编写一个SQL查询,以根据登录的用户及其角色检索表单名称,例如:如果管理员登录他应该获得所有表格,如果人力资源登录他应该只获得与人力资源相关的表格。
我尝试了这个查询:
$query = "SELECT ur.role_id, f.form_name, f.form_desc
FROM user_role ur, froms f
WHERE users.id = '".$user."',
users.status ='A',
forms.form_id = form_access.form_id,
from_access.role_id = user_role.role_id,
user_role.role_id = '".$user."'";`
有人帮我解决了正确的问题吗?
答案 0 :(得分:0)
你必须使用AND。
但是加入时应该会更好。
$query = "SELECT ur.role_id, f.form_name, f.form_desc
FROM from_access
INNER JOIN froms f ON forms.form_id = form_access.form_id
INNER JOIN user_role ur ON from_access.role_id = user_role.role_id
INNER JOIN users ON users.id = user_role.role_id
WHERE users.id = '".$user."'
AND users.status ='A' ";
答案 1 :(得分:0)
由于您从user_id开始,因此您需要选择user_role
并加入form_access
和form
。
SELECT `form`.`form_name` AS `form_name`
FROM `user_role` AS `ur`
INNER JOIN `form_access` AS `fa` ON `fa`.`role_id` = `ur`.`role_id`
INNER JOIN `form` AS `f` ON `f`.`form_id` = `fa`.`form_id`
WHERE `ur`.`user_id` = '".$user."'
PS:检查表名和列名。
答案 2 :(得分:-1)
您的查询完全被破坏,其他人可能已经为您提供了解决方案,但我会给您一些建议。
您已经编写了一个完整的查询,尝试过它,但它失败了。我整天都在编写查询,但是如果我在记事本中编写一个完整的查询然后执行它,它可能会在某处出现一些小错误。
从头开始。您正在尝试获取用户有权访问的表单列表,因此让我们从forms_access
表开始。那么最基本的出发点是什么?怎么样:
SELECT fa.role_id, fa.form_id
FROM forms_access fa
好的,这过分简化,但如果至少运行,我们知道我们已连接到数据库。
因此,我们可以轻松判断每个角色可以访问哪个form_id
。现在我们知道我们与users
的关联表格是user_roles
,所以我们将其添加到:{/ p>
SELECT ur.user_id, fa.form_id, fa.role_id
FROM forms_access fa
INNER JOIN user_roles ur ON fa.role_id = ur.role_id
因此,我们已在外键[{1}}上加入forms_access
到user_roles
。现在,我们可以查看每个role_id
,user_id
他们拥有哪些role_id
以及他们可以访问的form_id
。
所以我们几乎就在那里,我们只需要forms
表中的信息,所以让我们加入:
SELECT ur.user_id, f.form_name, f.form_desc, fa.form_id, fa.role_id
FROM forms_access fa
INNER JOIN user_roles ur ON ur.role_id = fa.role_id
INNER JOIN forms f ON f.form_id = ur.form_id
大!现在,我们列出了每个form_name/form_desc
可以访问的user_id
个列表。
尝试上面的步骤,如果你跳到最后可能会出现错误,因为我没有测试过代码,而且我不确定你的表定义是否符合问题。如果您一步一步地执行此操作,则只需检查最近添加的行以查找错误。
我刚刚在问题中注意到你还需要users.status = 'A'
,所以以与上面相同的方式,你需要在适当的外键上加入users表,给它一个去吧。
现在,一旦你完成了所有你需要将结果过滤到特定的user_id - 请注意,直到此时我们还没有打扰WHERE子句。
现在不要马上添加WHERE user_id = '$user'
的某些变体,因为那时你引入了2个潜在错误。而是尝试添加WHERE user_id = 0
(或一些已知的user_id)。查询是否运行且结果看起来是否正确?太好了,现在终于尝试添加你的php变量了。