2010-10-10 10 views
3

Salut à tous. J'ai l'ensemble suivant de tables qui est variable et additionne tous les jours:MySQL SELECT à partir d'un groupe de tables récupérées à partir de INFORMATION_SCHEMA

data-2010-10-10 
data-2010-10-11 
data-2010-10-12 
data-2010-10-13 

Et ainsi de suite. Toutes les tables ont la même structure et ce que je voudrais faire est de sélectionner des choses de toutes les tables à la fois. Je suis incapable d'utiliser une table MERGE puisque je cours InnoDB. Quoi qu'il en soit, j'utilise la déclaration suivante pour sélectionner les noms de table de mon information_schema:

select table_name from `information_schema`.`tables` 
    where `table_schema` = 'mydb2' and `table_name` like 'data-%' 

qui reviennent tous les tableaux que je voudrais unir. Je peux aussi grouper les résultats retournés pour obtenir la liste avec une virgule comme séparateur. Maintenant, où je suis bloqué est en cours d'exécution d'une requête de sélection qui permettrait effectivement de récupérer les données de ces tables.

Tous les indices sont appréciés. Merci! ~ K

+0

Voir aussi http://stackoverflow.com/questions/3807950/is-it-possible-to-execute-a-query-for-each-database-in-mysql-databases-and-sum-or/3808219 # 3808219 –

+0

Martin, semble plus comme ça, merci beaucoup! – kovshenin

Répondre

3

Vous devez utiliser SQL dynamique pour générer la ou les requêtes afin d'obtenir les résultats de ces tables. C'est-à-dire que vous récupérez les tables de votre requête information_schema en tant que chaînes, puis vous interpolez ces chaînes dans une autre requête.

Quelque chose impliquant UNION des requêtes individuelles contre toutes les tables:

SELECT ... 
FROM (SELECT * FROM `data-2010-10-10` 
     UNION ALL SELECT * FROM `data-2010-10-11` 
     UNION ALL SELECT * FROM `data-2010-10-12` 
     UNION ALL SELECT * FROM `data-2010-10-13`) AS u 

Mais je remets en question votre conception de créer une table séparée par jour. Cela semble être une chose pratique à faire au début, mais les tables se propagent hors de contrôle, et vous finissez par avoir des difficultés à faire des requêtes ordinaires, comme la difficulté que vous rencontrez maintenant. C'est un antipattern que j'appelle Metadata Tribbles.

Il est probable que vos données puissent être stockées dans une seule table, avec une colonne de date pour vous permettre de distinguer les données de différents jours. Vous avez probablement juste besoin de créer des index pour aider les requêtes que vous devez exécuter sur l'ensemble des données.


Re votre commentaire:

Vous ne pouvez pas faire des noms de table dynamique dans une requête SQL (y compris une définition de la vue). Vous pouvez interpoler les noms de table dans une chaîne, puis préparer la chaîne en tant que requête SQL.

Vous pouvez créer une chaîne avec la fonction CONCAT(), puis utiliser PREPARE and EXECUTE pour exécuter la chaîne en tant que requête. Mais puisqu'il n'y a pas de structures en boucle dans le client mysql, vous devrez écrire une procédure stockée pour le faire si vous ne pouvez pas écrire un script en Python ou PHP ou un autre langage hôte.

+0

Merci pour votre réponse Bill. Oui, les syndicats iraient bien si la requête courait de python/php, mais j'aimerais vraiment avoir ceci au niveau de MySQL, peut-être dans une vue. En fait, je distribue les données sur différents tableaux par mois et non par jours, mais je fais des jours de test et de benchmarking. Je suis d'accord avec beaucoup de tableaux comme ça, car ils seront archivés et interrogés une fois par mois pour obtenir des informations statistiques. Chaque table contiendra ~ 2 mil de lignes, la table active (actuelle) sera mise à jour toutes les 30 secondes (E/S aléatoires). – kovshenin

+0

+1 pour les Tribulations de métadonnées. –

+0

Et après 5.6, vous partitionnez cette table. –