【问题标题】:How to select values of one table based on values of another table in SQL, PHP如何根据SQL,PHP中另一张表的值选择一个表的值
【发布时间】:2014-07-03 11:08:15
【问题描述】:

我有 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 查询来根据登录的用户和他的角色来检索表单名称,例如如果管理员登录他应该得到所有的表格,如果 HR 登录他应该只得到与 HR 相关的表格。

我试过这个查询:

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

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

【问题讨论】:

  • 1.那么有什么问题呢? 2. 你拼错了一个表名“froms”。 3. 您获得了表别名但没有使用它们, 4. FROM 子句中仅有的 2 个表是 user_role 和 forms(/froms) 但您随后在 WHERE 子句中使用了 form_access (+ from_access) 和 users。
  • 这是编辑过的一个@OGHaza 但它不起作用$qury = "SELECT ur.role_id, f.form_name, f.form_desc FROM user_role ur, froms f, users u, form_access fa WHERE users.id = '".$user."', u.status ='A', f.form_id = fa.form_id, fa.role_id = ur.role_id, ur.role_id = '".$user."'";

标签: php mysql sql


【解决方案1】:

由于您从 user_id 开始,因此您需要从 user_role 和 JOIN 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】:

    你必须使用 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'  ";
    

    【讨论】:

    • 我认为条件 "user_role.role_id ='".$user."'" 应该是 "user_role.user_id = '".$user."'"
    • 是的,我正在尝试编辑后的答案,但我无法检索数据
    • 我只是想根据分配给登录用户的角色从表单中获取 form_name 我有用户 ID...
    【解决方案3】:

    您的查询完全中断,其他人可能已经为您提供了解决方案,但我会给您一些建议。

    您已经编写了一个完整的查询,尝试了它,但它失败了。我整天都在写查询,但是如果我在记事本中写了一个完整的查询然后执行它,它可能也会在某个地方出现一些小错误。

    从头开始。您正在尝试获取用户有权访问的表单列表,因此让我们从forms_access 表开始。那么最基本的出发点是什么?怎么样:

    SELECT fa.role_id, fa.form_id
    FROM forms_access fa
    

    好的,这过于简化了,但如果这样运行,至少我们知道我们已连接到数据库。

    所以我们可以很容易地分辨出每个角色可以访问哪个form_ids。现在我们知道我们到users 的链接表是user_roles,所以让我们将其添加到:

    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
    

    所以我们在外键 role_id 上加入了 forms_accessuser_roles。现在我们可以看到每个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
    

    太棒了!现在我们有了每个user_id 可以访问的每个form_name/form_desc 的列表。

    一步一步地尝试上面的方法,如果你跳到最后很可能会出错,因为我没有测试过代码,而且我不确定你的表定义是否与问题匹配。如果你一步一步做,你只需要检查最近添加的行就可以找到错误。

    我刚刚在问题中注意到您还需要users.status = 'A',因此与上述相同,您需要在适当的外键上加入用户表,试一试。

    现在,一旦您完成了将结果过滤到特定 user_id 所需的所有操作 - 请注意,到目前为止,我们还没有使用 WHERE 子句。

    现在不要立即添加WHERE user_id = '$user' 的某些变体,因为这样您就引入了 2 个潜在错误。而是尝试添加WHERE user_id = 0(或一些已知的user_id)。查询是否运行并且结果看起来是否正确?太好了,现在终于尝试添加您的 php 变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多