2017-01-26 3 views
0

J'ai des produits dans 3 tables (à structure identique) avec 3 colonnes de colonnes: id, date, requêtes. Lors de la recherche d'un identifiant de produit spécifique, je voudrais rechercher dans tous les tableaux (je ne sais pas à l'avance dans quel tableau l'ID de produit peut être trouvé)MySQL recherche l'ID dans plusieurs tables (structurées de façon identique)

table1 est très grand (plus de 100 millions de lignes), et actuellement j'utilise cette requête pour créer une table temporaire que j'utilise pour effectuer d'autres requêtes.

CREATE TEMPORARY TABLE temp ENGINE=MEMORY 
as (select DISTINCT id, date, requests from table1 WHERE id='$id'); 

SELECT ... FROM temp 

les 3 tables fusion en utilisant UNION et recherchez l'ID prend toujours en raison de la taille de table1 (plus de 100 millions de lignes), de sorte que ce n'est pas la bonne approche.

La façon la plus rapide je suis venu avec est (je le faire en utilisant PHP):

search table1, if id found create temporary table, 
if id not found in table 1 then 
search table2, if id found create temporary table, 
if id not found in table 2 then 
search table3, if id found create temporary table, 
if id not found in table3 then return id not found. 

Cependant cette façon, je finis par effectuer plusieurs requêtes (si id est situé dans le tableau 3 puis 4 requêtes auront été exécuté).

est-il une meilleure façon de faire cela avec MySQL?

AJOUTÉE:

Would quelque chose comme ce travail (ce qui est la syntaxe appropriée pour cela, ce que j'ai ci-dessous renvoie une erreur)

CREATE TEMPORARY TABLE temp ENGINE=MEMORY 
as (
(select DISTINCT id, date, requests from table1 WHERE id='$id') 
UNION 
(select DISTINCT id, date, requests from table2 WHERE id='$id') 
UNION 
(select DISTINCT id, date, requests from table3 WHERE id='$id') 
) 
+0

Vous pourriez créer une table temporaire contenant tous les identifiants à l'aide d'une union, mais vous devrez tout de même l'inclure dans une table singulière pour avoir une seule requête. Le simple fait d'utiliser les tableaux 2 et 3 le réduirait d'une requête et en inversant l'ordre (en cherchant le tableau 1 en dernier) vous pourriez réduire le temps. – Seth

+0

Merci pour la perspicacité, j'ai ajouté une option de plus que je pensais (UNION avec les instructions WHERE), mais je ne suis pas sûr de la syntaxe appropriée. – dean2020

+0

Quelle erreur obtenez-vous avec votre requête? [La documentation] (https://dev.mysql.com/doc/refman/5.7/en/union.html) semble indiquer qu'elle devrait fonctionner (au moins sans créer de table temporaire). – Seth

Répondre

0

essayer cette
SELECT * FROM information_schema.columns WHERE column_name = 'column_name';

ou

SELECT table_name, column_name FROM information_schema.columns WHERE column_name = 'column_name';

+1

Alors que cela l'aiderait à trouver les tables contenant les colonnes avec 'column_name', cela n'aiderait pas le problème réel. – Seth

+1

Cette réponse ne semble pas liée à ma question. – dean2020