Сортированный результат отличается от внутренних и левых объединений в MySQL - PullRequest
2 голосов
/ 19 июля 2010

Я только что обнаружил нерегулярность в запросе, который я сделал, почему результат отличается при использовании внутренних и левых соединений? например, результат упорядочен как во временной таблице попаданий, так и в конечном запросе?

Я сделал небольшой пример, чтобы показать проблему:

# 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 Ответ

2 голосов
/ 19 июля 2010

Это то, что вы ожидаете;выбранные i.ids в первом запросе равны 1, 2, 3 (и, вероятно, 4 позже), и они получают d, c и b в этом порядке.Выбранными значениями i.ids во второй таблице являются 2, 3, 4, соответствующие b, c и a.

Условие где выбирает три произвольно выбранных строки из объединения и применяется перед порядком по;это, по-видимому, и приводит к путанице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...