2017-03-05 44 views
1

我正在制作一个PHP脚本来显示当前用户属于哪个用户角色。 数据是在MySQL中,我想要的是显示所有可用角色及其所有角色,显示用户所属的位置。为什么这个mySQL LEFT JOIN不起作用?它可以是WHERE子句吗?

这是我的角色表

CREATE TABLE roles(
    roleID int unsigned not null auto_increment primary key, 
    nombreRol char(50) not null 
) 

这里的角色是:

registered 
pending 
student 
former-student 

,这就是USUARIOS表角色表

CREATE TABLE rolesUsuarios (
    rolesUsuariosID int unsigned not null auto_increment primary key, 
    userID int not null, 
    nombreRol char(50) not null 
) 
连接表

我试图创建一个LEFT JOIN像这样:

SELECT 
roles.nombreRol, 
rolesUsuarios.userID 
FROM roles 
LEFT JOIN rolesUsuarios 
ON roles.nombreRol = rolesUsuarios.nombreRol 
WHERE rolesUsuarios.userID = 183 

(我此刻不关心安全性,只是检查了查询工作)

在这个例子中,用户183具有注册学生

预期的结果应该是这样的:

nombreRol -------- userID 
registered ------- 183 
pending ---------- NULL 
student ---------- 183 
former-student --- NULL 

但我得到这样的结果,而不是:

nombreRol -------- userID 
registered ------- 183 
student ---------- 183 

我如何可以改变连接? (我跟着例子here,它并在那里工作,我认为我已经按照正确的查询逻辑)

+1

'OR .... IS NULL' –

+0

@ PM77-1 - Nope。 – GurV

回答

1

where子句转动left joininner join。将它添加到连接的ON子句中。

试试这个:

SELECT 
roles.nombreRol, 
rolesUsuarios.userID 
FROM roles 
LEFT JOIN rolesUsuarios 
ON roles.nombreRol = rolesUsuarios.nombreRol 
AND rolesUsuarios.userID = 183 
+0

谢谢,它确实有效!为什么where子句会对查询做到这一点?谢谢!! – Rosamunda

+1

@Rosamunda - 因为在连接之后应用了where子句。如果左表中没有右表中匹配的值,rightTable.userId的值将为null。因此,在将null与183进行比较时,它将评估为false,因此将该行从结果中排除。在连接表时,将评估“ON”子句。所以,它在那里正常工作。 – GurV

+0

谢谢@GurV !!!! – Rosamunda

0

我thinhk的结果是正确的。如果你想获得预期的结果,你的WHERE条件应该是这样的: WHERE rolesUsuarios.userID = 183或rolesUsuarios.userID为NULL