我有两个简单的表:
用户
+-------------------------------------------------+
| uid | firstname | lastname |
|-------------------------------------------------|
| 4000 | Zak | Me |
+-------------------------------------------------+
用户角色
+----------------------------------------------+
| rid | uid | oid |
|----------------------------------------------|
| 5 | 4000 | 7000 |
+----------------------------------------------+
我正在使用这个查询
SELECT us.firstname, us.lastname, ur.oid
FROM user us
LEFT JOIN user_role ur
ON us.uid = ur.uid
WHERE us.firstname = 'Zak';
我的结果是
+-------------------------------------------------+
| firstname | lastname | oid |
|-------------------------------------------------|
| Zak | Me | (null) |
+-------------------------------------------------+
我错过了什么?它必须是简单的东西!
更新
必须对 WHERE
子句做一些事情。因为如果省略,它会返回包含 oid
的所有行
最佳答案
遵循这样的流程:
运行这个查询
SELECT *
FROM user us
WHERE us.firstname = 'Zak';
如果您得到一个结果,Where 子句就可以了。所以现在你运行:
SELECT *
FROM user us
LEFT JOIN user_role ur
ON us.uid = ur.uid
WHERE us.firstname = 'Zak';
如果你没有得到记录,那么连接有问题。可能是他们有一些不可打印的字符,结果是 4000 <> 4000。那么让我们检查一下。
select * FROM user us where us.uid = 4000
select * FROM user_role us where us.uid = 4000
如果 then 之一没有返回结果,则存在数据问题,其中一个字段包含不可打印的字符。
如果 select * 有效,则再次尝试原始查询,仅添加 user_role 表中的一些其他字段,例如 uid。然后您可以查看联接是否有效但该字段为空,或者联接是否错误或者您可能正在查看错误的字段。
SELECT us.firstname, us.lastname, ur.oid, ur.uid
FROM user us
LEFT JOIN user_role ur
ON us.uid = ur.uid
WHERE us.firstname = 'Zak';
也有可能连接字段是不同的数据类型,某种类型的隐式转换把它们弄乱了。在这种情况下,您可能想要显式转换或最好设计您的表,以便它们都使用相同的数据类型,因为它们看起来处于 PK/FK 关系中。
关于MySQL 查询 JOIN 返回 1 个空字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34863041/