2011-07-02 3 views
1

On me demande si je peux récupérer le résultat de 18 bases de données Wordpress différentes fusionnées dans une base de données avec des noms conflictuels, les filtrer, puis jouer avec les résultats en PHP.Récupérer les résultats de différentes tables avec la même structure

Par exemple:

J'ai données (messages) dans ara_posts, val_posts et car_posts (tous sont des tables qui ont post_name, post_type, post_status et POST_DATE dans leurs noms de colonnes). Je veux sélectionner toutes les données de ces tables et filtrer le résultat (afficher seulement les résultats qui ont post_type = 'post'). Qu'est-ce que je veux faire avec le résultat est de comparer les dates et récupérer les 3 derniers messages de toutes ces 18 tables, qui ont leur statut à "publier" et le type de publication "post".

Comment est-ce possible?

+0

Les 3 derniers de chacun (soit 3x18 rangs) ou les 3 derniers de toutes les tables? –

+0

@ypercube Le dernier 3 (selon GMT) de toutes les tables - il va chercher les messages, puis de comparer qui a la date de publication GMT le plus récent, peu importe quelle table. – AeroCross

Répondre

2

Comme proposé dans une réponse à this question quite similar to yours, vous pouvez probablement utiliser l'opérateur UNION. Quelque chose comme ceci:

(SELECT post_name, post_type, post_status, post_date FROM ara_posts WHERE post_status='publish' AND post_type='post') 
UNION ALL 
(SELECT post_name, post_type, post_status, post_date FROM val_posts WHERE post_status='publish' AND post_type='post') 
UNION ALL 
(...) 
ORDER BY post_date DESC 
LIMIT 3 
+0

Cela semble fonctionner, mais c'est complètement inefficace dans le code, parce que si je devais copier/coller 18 requêtes exactes pour chaque requête que je devrais faire, ai-je raison? - Si je voulais changer la clause "where" dans l'une de ces requêtes, je devrais le faire manuellement pour chacun d'entre eux. Cela ne me semble pas optimal. – AeroCross

+0

@AeroCross: moins de code ne veut pas dire optimal. –

+0

@ypercube Je ne suis pas d'accord plus. Je pense que je pourrais avoir utilisé la mauvaise expression - ne me semble pas le code "maintanable". Tu n'as aucune suggestion? – AeroCross

1

Et vous pourriez ajouter une colonne manuelle à la sélection afin que vous sachiez la base de données que les données utilisées sont:

(SELECT 'ara' as dbname, post_name, post_type, post_status, post_date FROM ara_posts WHERE post_status='publish' AND post_type='post') 
UNION ALL 
(SELECT 'val' as dbname, post_name, post_type, post_status, post_date FROM val_posts WHERE post_status='publish' AND post_type='post') 
UNION ALL (...) ORDER BY post_date DESC LIMIT 3 
1

J'ajouterais la partie ORDER BY post_date DESC LIMIT 3 dans tous les sous-requêtes. De cette façon, toutes les sous-requêtes utiliseront l'index du champ post_date de la table correspondante et la requête principale n'aura qu'à trier 18x3 lignes.

Si vous ne disposez que de la requête principale, vous devrez récupérer toutes les lignes (en milliers de millions?) Puis trier. Je ne suis pas sûr que l'optimiseur est assez intelligent pour ne pas le faire:

(SELECT post_name, post_type, post_status, post_date, 'ara' AS source 
    FROM ara_posts 
    WHERE post_status='publish' 
    AND post_type='post' 
    ORDER BY post_date DESC 
    LIMIT 3 
) 
UNION ALL 
(SELECT post_name, post_type, post_status, post_date, 'val' AS source 
    FROM val_posts 
    WHERE post_status='publish' 
    AND post_type='post' 
    ORDER BY post_date DESC 
    LIMIT 3 
) 
UNION ALL 
(...) 
ORDER BY post_date DESC 
LIMIT 3 

Et Dennis a un très bon point sur la façon d'identifier la source des résultats finaux.

+0

Très bon point en effet. – Viktor

1

Je définirais une vue, basée sur les requêtes d'union dans les autres réponses (mais sans les parties where et limit). Ensuite, vous pouvez interroger la vue directement. Une vue est l'analogue d'une fonction - c'est votre unité de base de réutilisation pour les bases de données.

+0

Ceci est certainement un excellent conseil. Je vais vous dire que tout va bien. – AeroCross

Questions connexes