4 votes

Requête mySQL pour retourner le dernier enregistrement de chaque table

J'ai une base de données mySQl (nom "stocks") avec 50 tables, chaque table avec

id, symbole, date, heure, ouverture, haut, bas, fermeture, volume comme colonnes (9 colonnes).

Je voudrais savoir quel est le dernier enregistrement de chaque table, classé par date puis par heure.

Est-ce que je dois faire un ORDER BY de toutes les données pour chaque table ou y a-t-il une meilleure façon de connaître le dernier enregistrement ?

Je demande de l'aide pour une requête qui ne renvoie que le dernier enregistrement pour chaque table de la base de données.

Gracias

PS Pour le dernier enregistrement, je veux dire le plus récent en tant que date puis heure.

11voto

Vyktor Points 10531

Il existe deux possibilités pour y parvenir :

-- I would use this only if you need more than one records
SELECT * FROM table ORDER BY date DESC LIMIT 1;

-- Way to go:
SELECT * FROM table WHERE date = (SELECT MAX(date) FROM table) LIMIT 1;

N'oubliez pas d'ajouter l'index sur date . S'il est possible que vous ajoutiez beaucoup d'enregistrements en même temps, vous devrez le faire :

ORDER BY id DESC -- In case that date is highest for records for last records
ORDER BY time DESC -- Every other case

Jusqu'à la fin de la requête

7voto

Je vais partir du principe que l'enregistrement ayant le plus grand ID est le "dernier" (en supposant que les ID séquentiels strictement croissants sont uniques dans une table). Si vous avez une meilleure définition de "dernier", cela pourrait faire la différence.

Pour obtenir un "dernier" enregistrement, vous pourriez faire :

Select * from table_1 where id = (select max(id) from table_1);

Pour obtenir les résultats des 50 tables dans un seul ensemble de résultats, vous pourriez faire ce qui suit :

Select * from table_1 where id = (select max(id) from table_1)
union
Select * from table_2 where id = (select max(id) from table_2)
union
Select * from table_3 where id = (select max(id) from table_3)
union...

Une solution spécifique à MySQL pourrait être

Select * from table_1 order by id desc limit 1
union
Select * from table_2 order by id desc limit 1
union
Select * from table_3 order by id desc limit 1
union...

Sur la base de votre édition (où vous définissez réellement ce que vous entendez par "dernier") :

Select * from table_1 order by date desc, time desc, id desc limit 1
union
Select * from table_2 order by date desc, time desc, id desc limit 1
union
Select * from table_3 order by date desc, time desc, id desc limit 1
union...

0voto

sapientum8 Points 1

Voici une façon de le faire sans trier le tableau :

select * from tab1
 where time = (select max(time)
                 from tab1
                where date = (select max(date) from tab1))
   and date = (select max(date) from tab1)

Cela devrait être très rapide, comme, O(c), à condition que les deux colonnes soient indexées, sinon le temps sera simplement O(n)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X