Je sais qu'il s'agit d'un fil de discussion vieux de 7 ans, mais la question était presque identique et la réponse acceptée était celle avec laquelle j'ai commencé et que j'ai finalement optimisée pour obtenir ce qui suit, qui dans mon cas donne des résultats cohérents. 85ms +-5ms avec <some_column> étant un champ int indexé.
note1 L'exemple UNION ALL dans la réponse acceptée fonctionne également mais était moins performant dans mon cas avec 300ms +-20ms.
note2 La réponse suivante la plus votée (l'exemple du compteur de lignes) fonctionne également mais était la moins performante dans mon cas, avec 800 ms + 70 ms.
select
(select <some_column> from <some_table>
order by <some_field> limit 1) as oldest,
(select <some_column> from <some_table>
order by <some_field> desc limit 1) as newest
;
J'ai bien noté que l'op faisait référence à d'éventuelles jonctions. Je n'ai pas eu besoin d'inclure des jointures pour mes propres besoins (je me contente d'obtenir les identifiants les plus bas et les plus élevés dans une vue assez dynamique), mais avec ce modèle, les sous-requêtes pour l'identifiant le plus ancien et le plus récent devraient pouvoir être des requêtes à part entière. Je n'ai pas testé, donc je ne suis pas sûr que cela fonctionnerait ou serait optimal.
J'ai testé ce modèle (qui a peut-être déjà été suggéré ci-dessus) qui pourrait être un peu plus facile à comparer, mais la performance telle quelle était juste un peu moins de la moitié de l'exemple ci-dessus, avec un résultat constant de 220 ms +-10 ms dans mon cas.
select oldest.<some_field> as old,
newest.<some_field> as new
from
(select <some_column> from <some_table>
order by <some_field> limit 1) as oldest,
(select <some_column> from <some_table>
order by <some_field> desc limit 1) as newest
;