Sorki za kiepski temat, ale nie sposób wymyślić coś sensownego.
Mam dwie tabele:
articles
id (PK)
article_versions
id (PK)
article_id (FK reference to articles.id)
modified (datetime)
published (0/1)
Aktualna wersja artukułu to ta, której published = 1 i modified jest największy ('najmłodszy').
Chciałbym teraz wybrać wszystkie articles, które mają opublikowaną wersję wraz z id wersji aktualnej i :
SELECT Article.id, ArticleVersion.modified, ArticleVersion.id from articles as Article
INNER JOIN article_versions as ArticleVersion
ON (Article.id = ArticleVersion.article_id AND ArticleVersion.published =1)
GROUP BY Article.id
ORDER BY ArticleVersion.modified DESC
Załóżmy, że mam article o id 54, które mają wersje 97, 98, 99. Jednak tak się składa, że article_version o id 99 jest aktualny. Niestety Inner join złączy te tabele tak:
54 97
54 98
54 99
a group_by wywali drugi i trzeci wiersz. Zatem zostaję z article_version 97, który nie jest prawidłowy.
Pewnie mogę to zrobić podając w inner join podzapytanie, w którym dam odpowiedni order by. Jednak chciałbym, żeby to zapytanie było jak najbardziej optymalne. Czy znacie jakiś sprytny sposób na to, żeby:
a) wywalić wiersze, których articles.id się dublują po wykonaniu sortowania
lub
b) zmusić JOINA, żeby łączył wiersze z drugiej tabeli w innej kolejności (pod warunkiem, że nie oznacza to sortowania całej tabeli article_version dla każdego wiersza articles)
A może za bardzo kombinuję? Czy może jak w INNER JOIN zastosują podzapytanie, to MySQL mi go wrzuci do CACHE i tak naprawdę wykona się tylko raz?
TIA