我有两个简单的表格:
用户
+-------------------------------------------------+
| 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
的所有行
答案 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关系中看起来相同的数据类型。