2010-07-19 94 views
2

我刚刚在查询中发现了这个不规则的问题,为什么在使用内连接和左连接时结果不同?一个,结果是在临时命中表和最终查询中排序?排序的结果与mysql中的内连接和左连接有所不同

我做了一个小例子来说明这个问题:

# cleanup 
drop temporary table if exists ids; 
drop temporary table if exists arts; 

# create temporary tables 
create temporary table arts (id int, title varchar(100), posted datetime); 
create temporary table ids (id int, artid int); 

# insert dummy articles 
insert into arts (id, title, posted) VALUES (1, 'a', '2010-04-01'); 
insert into arts (id, title, posted) VALUES (2, 'b', '2010-07-01'); 
insert into arts (id, title, posted) VALUES (3, 'c', '2010-06-01'); 
insert into arts (id, title, posted) VALUES (4, 'd', '2010-08-01'); 

# insert ordered list of hits 
insert into ids (id, artid) values (1, 4); 
insert into ids (id, artid) values (2, 2); 
insert into ids (id, artid) values (3, 3); 
insert into ids (id, artid) values (4, 1); 

# execute queries 
select i.artid, a.posted from ids i left join arts a on a.id = i.artid; 
select i.artid, a.posted from ids i inner join arts a on a.id = i.artid; 

# cleanup 
drop temporary table if exists arts; 
drop temporary table if exists ids; 

第一查询返回:

4,2,3,1 (as expected, ordered by posted-column descending) 

第二个返回:

1,2,3,4 (ordered by pk?) 
+0

第二个查询在哪里? – kevingessner 2010-07-19 12:32:30

+0

它现在应该在那里,之前是编辑错误 – possan 2010-07-19 12:34:19

+0

您应该每次获得4行,因为您的@row变量在每行之后递增,而不是之前。我做了上面的SQL,得到了两个相同的结果(每行4行,不是3)。你使用的是什么版本的MySQL? – 2010-07-19 12:39:38

回答

2

这是你会什么期望;在第一个查询中选定的i.id是1,2,3(以及后来的4个,大概是),并且它们依次得到d,c和b。第二个表中选定的i.id是2,3,4匹配的b,c和a。

where条件从连接中挑选出三个任意选择的行,并在该命令之前应用;这可能是导致混淆的原因。

+0

我仍然有相同的“不规则”排序,但我解决了排序第一和限制结果后,希望它不会毁了那么多的表现... 我会将此标记为答案。 – possan 2010-07-19 13:05:00

+0

首先进行排序并事后进行限制正是您想要做的事情,而您的示例将说明原因。 – 2010-07-19 13:24:03