【问题标题】:Why this mySQL LEFT JOIN won't work? Can it be the WHERE clause?为什么这个 mySQL LEFT JOIN 不起作用?可以是 WHERE 子句吗?
【发布时间】:2017-03-05 03:43:50
【问题描述】:

我正在制作一个 PHP 脚本来显示当前用户所属的用户角色。 数据在 mySQL 中,我想要显示所有可用的角色,并在所有角色中显示用户所属的位置。

这是我的角色表

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 进行了操作,它确实在那里工作,我认为我正确地遵循了查询的逻辑)

【问题讨论】:

  • ` OR.... 为空`
  • @PM77-1 - 不。

标签: php mysql join left-join


【解决方案1】:

您的where 子句将left join 转换为inner join。改为将其添加到连接的 ON 子句中。

试试这个:

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

【讨论】:

  • 谢谢,它确实有效!为什么 where 子句对查询执行此操作?谢谢!!
  • @Rosamunda - 因为 where 子句在加入后应用。如果左表中的行在右表中没有匹配值,则 rightTable.userId 的值将为空。因此,当将 null 与 183 进行比较时,它将评估为 false,因此该行被排除在结果之外。 ON 子句在表连接时进行评估。所以,它在那里正常工作。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 2021-02-15
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    相关资源
    最近更新 更多