2017-01-17 5 views
-1

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

+2

Ce genre de problème est parfois symptomatique d'un design (effroyablement) médiocre. – Strawberry

Répondre

0

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; 
+0

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 –

+0

ORDER BY timestamp DESC ou ASC (pour chaque table) et que LIMIT 1 – cSteusloff

+0

La fonction GROUP_CONCAT sans GROUP BY ne fait pas sens .. –

0

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... 
+0

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? –