MySQL Query JOIN返回1个空字段

时间:2016-01-18 19:58:30

标签: mysql sql

我有两个简单的表格:

用户

+-------------------------------------------------+
|   uid    |     firstname     |     lastname     |
|-------------------------------------------------|
|   4000   |       Zak         |        Me        |
+-------------------------------------------------+

USER_ROLE

+----------------------------------------------+
|   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的所有行

1 个答案:

答案 0 :(得分:4)

按照这样的流程:

运行此查询

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';

如果yuo没有记录,那么连接有问题。可能是因为它们具有一些不可打印的字符并且因此具有4000<> 4000。所以,让我们检查一下。

select * FROM user us where us.uid = 4000
select * FROM user_role us where us.uid = 4000

如果其中一个没有返回结果,则存在数据问题,其中一个字段包含不可打印的字符。

如果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关系中看起来相同的数据类型。