Witam, mam takie tabele:
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 1406
42 62 2008-07-25 1223
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 1223
42 92 2008-08-04 1406
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?