2

VERSION 我正在使用服务器版本:5.1.36-community-log MySQL Community Server (GPL)

我终于设计了一个简单的例子来轻松重现它!

设置:

create table t1(id integer unsigned,link integer unsigned);
create table t2(id integer unsigned auto_increment,primary key(id));
create table t3(id integer unsigned,content varchar(30));
insert into t1 value(1,null);
insert into t2 value(1);
insert into t3 value(1,'test');

然后运行:

select t2.*,t3.* 
from t1
left join t2 on t1.link=t2.id
left join t3 on t3.id=t2.id
where t1.id=1;

会错误地得到这个:

+------+------+---------+
| id   | id   | content |
+------+------+---------+
| NULL |    1 | test    |
+------+------+---------+

但是如果我们以这种方式创建 t2,它就不会发生:

create table t2(id integer unsigned);

所以,它与主键有关!

新发现

运行它不会触发错误:

select t2.*,t3.*
from t1
left join t2 on t1.link=t2.id
left join t3 on t2.id=t3.id
where t1.id=1;

所以它也与加入方向有关!

4

4 回答 4

1

我刚刚在 MySQL 5.0.58、5.0.82 和 5.1.35 上运行你创建、插入和选择,我收到了以下结果,我认为这是正确的:

+------+------+---------+
| id   | id   | content |
+------+------+---------+
| NULL | NULL | NULL    |
+------+------+---------+

这正是我使用的:

CREATE TABLE `t1` (
  `id` int(10) unsigned default NULL,
  `link` int(10) unsigned default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `t1` VALUES (1, NULL); 

CREATE TABLE `t2` (
  `id` int(10) unsigned NOT NULL auto_increment,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 ;

INSERT INTO `t2` VALUES (1);

CREATE TABLE `t3` (
  `id` int(10) unsigned default NULL,
  `content` varchar(30) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `t3` VALUES (1, 'test');

SELECT t2.id, t3.id, t3.content
FROM t1
LEFT JOIN t2 ON t1.link = t2.id
LEFT JOIN t3 ON t2.id = t3.id
WHERE t1.id = 1;
于 2009-10-04T18:55:18.720 回答
0

很有意思。这确实看起来像 MySQL 中的一个错误。查询结果取决于是否有主键。他们绝对不应该影响结果。作为参考,PostgreSQL 将使用主键返回正确的结果,所以我认为这不太可能是预期的行为。

于 2009-10-04T18:45:34.667 回答
0

您的设置代码错误

create table t1(id integer unsigned,link integer unsigned);  
create table t2(id integer unsigned auto_increment,primary key(id));  
create table t2(id integer unsigned,content varchar(30));

             ^^  This is wrong. Should be t3

另外,请确保在每次测试后放下桌子。你可能有一些错误的数据。

于 2009-10-04T18:48:04.927 回答
0

'fuinfo'中的'fid'行之一是否设置为NULL?MySQL 可以将其与左表中的 NULL 值连接起来。

于 2009-10-04T15:17:58.050 回答