Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL interroge plusieurs tables

D'accord, même si je suis en partie d'accord sur le fait que vous devriez faire quelques recherches et en savoir plus sur les jointures à gauche, il y a aussi une difficulté à répondre correctement à cette question qui pourrait être perdue pour un débutant. Je vais continuer et vous aider à y répondre, mais je vous recommande d'en savoir plus sur les jointures.

Ma requête exacte dépendrait des index disponibles, mais elle ressemblerait très probablement à ceci :

SELECT a.* 
FROM products AS a
LEFT JOIN (
SELECT product_id FROM order_products as b 
INNER JOIN orders AS c
ON b.order_id = c.order_id
WHERE c.date_ordered >= date_sub(c.date_ordered, INTERVAL 7 day)
GROUP BY product_id 
) AS d
ON a.product_id = d.product_id 
WHERE d.product_id IS NULL

Ce que je fais, c'est que j'écris une sous-requête qui joint les commandes et les commandes de produits, où date_ordered tombe dans une certaine plage de dates (je recommanderais d'en savoir plus sur la fonction date_sub ici :http://www.w3schools.com/sql/func_date_sub.asp et effectuez également quelques requêtes SELECT date_sub(date_ordered, INTERVAL X DAY) FROM commandes rapides pour vous assurer que vous comprenez comment ce calcul fonctionne, dans la pratique.

Maintenant, j'obtiens ma liste de commandes pour les X derniers jours (7 dans la requête ci-dessus) et je la joins à la table des produits des commandes pour obtenir les produits qui ont été commandés. Ici, je veux dédupliquer mes produits, en gros. Product_id =300 peut avoir été commandé 70 fois. Product_id =200 peut avoir été commandé 50 fois. Quoi qu'il en soit, je ne souhaite pas joindre 70 enregistrements et 50 enregistrements à ma table de produits pour les identifiants de produits 300 et 200, je les ai donc dédoublés. Cette dernière instruction GROUP BY fait cela. C'est fonctionnellement la même chose que d'écrire DISTINCT (bien qu'il puisse y avoir des différences mineures dans la façon dont ceux-ci sont calculés dans certaines circonstances, aucune de ces circonstances ne semble s'appliquer ici... utilisez DISTINCT si c'est plus clair pour vous)

Une fois que j'ai ma liste d'identifiants de produits uniques qui ont été commandés au cours des X derniers jours, je la joins à ma table de produits. Ici, j'utilise une jointure gauche. Comme les commentaires notés ci-dessus, vous voudrez examiner assez attentivement la notion de jointures. Faites-le, si vous ne l'avez pas déjà fait.

Enfin, j'applique un filtre WHERE qui indique "WHERE d.product_id IS NULL". Ce que cela fait, c'est dire "d'accord, si product_id =Y a été commandé au cours des X derniers jours, il se joindra avec succès à ma table de produits avec a.product_id =d.product_id. S'il n'a pas été commandé, alors a. product_id existera dans mon jeu de résultats, mais d.product_id n'existera pas. Autrement dit, d.product_id sera nul."

Cette dernière torsion peut être la partie qui n'est pas apparente / qui se démarque.

J'espère que cela t'aides.