views:

44

answers:

1

I just found this irregularitry in a query i made, why does the result differ when using inner and left joins? for one, the result is ordered both in the temporary hit table and in the final query?

I made a little example to show the problem:

# 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;

the first query returns:

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

the second one returns:

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

This is what you would expect; the selected i.ids in the first query are 1, 2, 3 (and 4 later, presumably) and they get d, c and b in that order. The selected i.ids in the second table are 2, 3, 4 matching b, c and a.

The where condition picks out three arbitrarily selected rows from the join, and is applied before the order by; this is presumably what leads to the confusion.

Brian Hooper
i still have the same "irregular" ordering but i solved by sorting first and limiting the result afterwards, hoping it won't ruin the performance that much...i'll mark this as a answer.
possan
Sorting first and limiting afterwards is precisely what you want to do, and your example shows why.
Brian Hooper