Witam, mam takie tabele:
user image
article_versions.article id to klucz obcy do articles.id, article_pages.article_version_id to klucz do article_version.id

Teraz chcę wybrać najbardziej aktualną wersję artykułu (to taka, która ma published = 1 i modified jest największy ("najpóźniejszy") (problem był poruszony przeze mnie tutaj: http://4programmers.net/Forum/viewtopic.php?id=131788):

 SELECT Article.id, ArticleVersion.id, ArticleVersion.modified
  FROM `articles` AS `Article`
  INNER JOIN (
                     SELECT *
                     FROM `article_versions`
                     WHERE `article_versions`.published =1
                     ORDER BY `article_versions`.modified DESC
                  ) AS `ArticleVersion` 
                        ON ( `ArticleVersion`.article_id = `Article`.id )

Wynik jest następujący (chodzi o to, żeby pierwszy wiersz był TYM z prawidłowym, gdyż później dodam sobie klauzulę group by Article.id i zostanie mi pierwszy element, który jest dobry) :
id id modified
42 92 2008-08-04 14:04:06
42 62 2008-07-25 12:04:23
Czyli wszystko jest ok.

Jeśli jednak zechcę jeszcze połączyć wynik z tabelą article_pages (żeby wybrać pierwszy article_page) i zrobię to za pomocą INNER JOIN:

SELECT Article.id, ArticleVersion.id, ArticleVersion.modified
FROM `articles` AS `Article`
INNER JOIN (
                       SELECT *
                       FROM `article_versions`
                       WHERE `article_versions`.published =1
                       ORDER BY `article_versions`.modified DESC
) AS `ArticleVersion` ON ( `ArticleVersion`.article_id = `Article`.id )
INNER JOIN `article_pages` AS ArticlePage ON ( ArticlePage.article_version_id = ArticleVersion.id )

to kolejność zwróconych wierszy będzie odwrotna:
id id modified
42 62 2008-07-25 12:04:23
42 92 2008-08-04 14:04:06

Jednak gdy zrobię to przy pomocy LEFT JOIN - kolejność się nie zmienia.
Teraz moje pytanie: dlaczego tak się dzieje? Teoretycznie, z tego co wiem o kolejności wykonywania zapytań sql, ta kolejność nie powinna sie zmienić. Czy przy INNER JOIN zachodzi jakaś optymalizacja, która sprawia, że wiersze są w innej kolejności?

Czy to znaczy również, że gdy próbuję wymusić kolejność "joinowania" tu:

INNER JOIN (
                SELECT *
                FROM `article_versions`
                WHERE `article_versions`.published =1
                ORDER BY `article_versions`.modified DESC
)

to nie mogę być w 100% pewien tej kolejności?