为什么我的子查询无法从外部查询访问列

时间:2015-12-22 10:16:41

标签: mysql sql

我试图让所有没有至少一个角色的用户获得值为secure = 1

例如: 假设我们有这些数据:

用户:

id | name | email |password

500 | admin | admin@gmail.com | something

600 | someuser | test@gmail.com | something

作用:

id | name | secured

1 | Administrator | 1

2 | Guest | 0

3 | Normal | 0

roles_user:

user_id | role_id

500 | 1

500 | 3

600 | 2

600 | 3

我希望查询返回: 只有id为600的用户

查询:

    SELECT * 
    FROM `users` 
    WHERE (SELECT MAX(roles.secured) FROM roles 
           JOIN role_user 
           ON role_user.user_id = users.id 
           AND role_user.role_id = roles.id) != 1

返回一个mysql错误:

  

1054 - 'on clause'

中的未知列'users.id'
你可以帮忙吗?

架构:

用户:

Column  Type    Null    Default Comments
id (Primary)    int(10) No      
name    varchar(255)    No      
email   varchar(255)    No      
password    varchar(60) No      
blocked tinyint(1)  No  0   
remember_token  varchar(100)    Yes NULL    


roles:

Column  Type    Null    Default Comments
id (Primary)    int(10) No      
name    varchar(255)    No      
secured tinyint(1)  No  1   
display_name    varchar(255)    Yes NULL    
description varchar(255)    Yes NULL    


role_user:

Column  Type    Null    Default Comments
user_id (Primary)   int(10) No      
role_id (Primary)   int(10) No      

1 个答案:

答案 0 :(得分:0)

根据您提供的数据,假设您想要的输出是返回具有最高“安全”的用户的详细信息。您需要对role_user表中的每个表执行两次连接。然后把你的位置放在最后只返回最大值条目。

      SELECT * 
      FROM `users` 
       JOIN role_user 
      ON users.id = role_user.user_id 
       JOIN roles
      ON roles.id = role_user.role_id
      WHERE roles.secured = (SELECT MAX(roles.secured) FROM roles

为了让所有没有安全值为1的用户,你应该确定安全值为1的用户,然后让所有用户WHERE id NOT IN(这里得到所有用户的查询)。

例如:

      SELECT * 
      FROM `users` 

      WHERE users.id NOT IN (SELECT * FROM users
                              JOIN role_user 
                             ON users.id = role_user.user_id 
                              JOIN roles
                             ON roles.id = role_user.role_id
                             WHERE roles.secured = 1)