我的问题是:我的想法有什么问题?
为什么左连接没有像我想象的那样工作?
更多信息。
我有这个 sql fiddle 显示我在使用左外连接时面临的问题
结构
CREATE TABLE IF NOT EXISTS `mychanges` (
`object_id` int(11) unsigned NOT NULL,
`version_stamp` datetime DEFAULT NULL,
`object_name` varchar(255) DEFAULT NULL,
`project` int(11) unsigned DEFAULT NULL,
PRIMARY KEY (`object_id` ,`version_stamp`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO mychanges VALUES (1266, "2014-09-24 09:55:40", "bbbb", 2 );
INSERT INTO mychanges VALUES (1236, "2014-09-24 09:55:40", "aaa", 2 );
INSERT INTO mychanges VALUES (1226, "2014-09-24 09:55:40", "zzz", 5 );
INSERT INTO mychanges VALUES (1216, "2014-09-24 09:55:40", "xxxx", 8 );
INSERT INTO mychanges VALUES (1256, "2014-09-24 09:51:40", "name1", 10 );
INSERT INTO mychanges VALUES (1256, "2014-09-24 09:52:40", "name2", 10 );
INSERT INTO mychanges VALUES (1256, "2014-09-24 09:53:40", "name3", 10 );
INSERT INTO mychanges VALUES (1256, "2014-09-24 09:54:40", "name4", null );
INSERT INTO mychanges VALUES (1256, "2014-09-24 09:56:40", "name5", null );
选择
SELECT mychanges.object_id AS objectid1, mychanges.object_name AS objectname1, mychanges.version_stamp AS version_stamp1, change2.project as project2, change2.version_stamp as version_stamp2, change2.object_name as objectname2 FROM mychanges
LEFT JOIN (SELECT * from mychanges AS x WHERE x.project IS NULL) AS change2
ON change2.object_id = mychanges.object_id
WHERE mychanges.project = 10
我想得到什么:
插入的值
INSERT INTO mychanges VALUES (1256, "2014-09-24 09:51:40", "name1", 10 );
INSERT INTO mychanges VALUES (1256, "2014-09-24 09:52:40", "name2", 10 );
INSERT INTO mychanges VALUES (1256, "2014-09-24 09:53:40", "name3", 10 );
INSERT INTO mychanges VALUES (1256, "2014-09-24 09:54:40", "name4", null );
INSERT INTO mychanges VALUES (1256, "2014-09-24 09:56:40", "name5", null );
所以用书面语言:作为项目的所有记录都是 10,并且所有记录具有相同的对象 ID 和项目 ID 为 10 的记录。
为什么?
这是一个变更集表。用户正在更改对象名称并按 Enter。这会以更改的形式生成条目。遗憾的是,这些更改的项目 id 可能为 null。对象 id 是唯一的。
我在想什么?
我想:是的,我们有所有 project_id 为 NULL 的条目。剩下的我们有 project_id 和 10 的所有记录。如果我们使用 加入它们object_id
,我们会得到两个,没有重复。但相反,我们得到了 name4 和 name5 的重复项,而不是 name1、name2 和 name3。
为什么不?