J'ai plus de 400 tables et chacune a un horodatage de colonne. Je voudrais tirer la première ligne/enregistrement pour l'horodatage pour chacune de ces tables. Je ne veux pas exécuter plus de 400 requêtes, quelle serait la meilleure façon de le faire?MySQL sélectionner un enregistrement de plusieurs tables
Répondre
Vous pouvez exécuter une UNION requête comme ceci:
SELECT Id, yourColumn, timestamp FROM Table001 ORDER BY timestamp DESC LIMIT 1
UNION ALL
SELECT Id, yourColumn, timestamp FROM Table002 ORDER BY timestamp DESC LIMIT 1
UNION ALL
SELECT Id, yourColumn, timestamp FROM Table003 ORDER BY timestamp DESC LIMIT 1
ORDER BY timestamp
Utilisez une boucle pour créer cette déclaration:
SET @resultQuery = NULL;
SELECT
GROUP_CONCAT(
DISTINCT
CONCAT('SELECT * FROM ', table_name, ' ORDER BY timestamp DESC LIMIT 1 ')
SEPARATOR '\r\nUNION\r\n'
)
INTO
@resultQuery
FROM
information_schema.COLUMNS
WHERE
table_schema = '???' AND column_name LIKE '%timestamp';
SELECT @resultQuery;
Je ne veux pas sélectionner un horodatage spécifique mais plutôt le premier enregistrement de chaque table et la valeur correspondante de l'horodatage de colonne –
ORDER BY timestamp DESC ou ASC (pour chaque table) et que LIMIT 1 – cSteusloff
La fonction GROUP_CONCAT sans GROUP BY ne fait pas sens .. –
La nécessité pour le premier enregistrement de tables 400+ sent mauvais conception, mais si elles ont le même schéma, vous pouvez utiliser UNION ALL
:
SELECT * FROM foo ORDER BY timestamp ASC LIMIT 1
UNION ALL
SELECT * FROM bar ORDER BY timestamp ASC LIMIT 1
UNION ALL
SELECT * FROM baz ORDER BY timestamp ASC LIMIT 1
-- etc...
Il s'agit d'une utilisation unique pour laquelle la BD n'a pas été conçue. Je ne sais pas si c'est un mauvais design ou pas, mais je ne serais pas surpris. Donc je vais devoir créer une requête longue de plus de 800 lignes? –
Ce genre de problème est parfois symptomatique d'un design (effroyablement) médiocre. – Strawberry