如何根据SQL,PHP中另一个表的值选择一个表的值

时间:2014-07-03 11:08:15

标签: php mysql sql

我有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."'";`

有人帮我解决了正确的问题吗?

3 个答案:

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

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_accessuser_roles。现在,我们可以查看每个role_iduser_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变量了。