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')
)
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
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
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