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

「fuinfo」の「fid」行の 1 つが NULL に設定されていますか? MySQL は、左側のテーブルの NULL 値と結合している可能性があります。

于 2009-10-04T15:17:58.050 に答える