排序结果因mysql中的内连接和左连接而异

时间:2010-07-19 12:29:33

标签: sql mysql database sorting join

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

我举了一个例子来说明问题:

# 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?)

1 个答案:

答案 0 :(得分:2)

这是你所期望的;第一个查询中选定的i.ids是1,2,3(后来可能是4个),它们按顺序得到d,c和b。第二个表中选定的i.ids是2,3,4匹配b,c和a。

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