2010-07-19 51 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