2014-09-08 1 views
1

Merci d'avoir jeté un oeil à ma question! J'ai essayé de trouver une seule requête pour faire ce qui suit, mais j'ai échoué. J'apprécierais vraiment toute aide. Merci d'avance :-)MySQL interroger plusieurs tables

Je crée une page d'administration pour mon magasin en ligne qui montre les produits qui n'ont pas été vendus au cours des X derniers jours. Il y a trois tables qui doivent être ...

Table: products 
Column: product_id (int) 

Ce tableau/colonne contient tous les produits dans le magasin

Table: orders 
Columns: order_id (int), date_ordered (datetime) 

Ce tableau contient toutes les commandes qui sont identifiés par order_id et date à laquelle ils ont été commandés (date_ordered).

Table: order_products 
Column: order_id (int), product_id (int) 

Ce tableau contient une liste complète de tous les produits commandés (Product_ID) et l'ordre correspondant (order_id). Donc, la requête que j'essaie de comprendre utilisera l'utilisation de order_id dans les tables orders et order_products pour déterminer quels produits ont été vendus au cours des X derniers jours ... Puis retourner les products_id de la table des produits qui n'ont pas vendu au cours des X derniers jours.

Des suggestions? Toute aide serait très appréciée! Merci :-)

+0

Avez-vous essayé quelque chose? Comme regarder un' LEFT JOIN' par exemple? .. – Kleskowy

+0

AS ci-dessus vous devez créer plusieurs jointures - voir ce lien pour un bon tutoriel [LINK] (http://www.sitepoint.com/understanding-sql-joins-mysql-database/) – aphextwix

+0

@aphextwix Merci pour le lien vers le tutoriel Je connaissais Join mais je n'ai jamais utilisé left, right ou outer Le didacticiel que vous avez suggéré était super Merci –

Répondre

1

Bon, alors que je suis d'accord pour dire que vous devriez faire quelques recherches et en savoir plus sur les jointures à gauche, il est également difficile de répondre correctement à cette question qui pourrait être perdue pour un débutant. Je vais aller de l'avant et vous aider à y répondre, mais je recommanderais d'en savoir plus sur les jointures.

Ma requête exacte dépendra des indices disponibles, mais il ressemble très probablement quelque chose comme 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 est que je suis en train d'écrire un sous-requête qui joint les commandes et les produits de commandes ensemble, où date_ordered se situe dans une certaine plage de dates (je recommanderais d'en apprendre plus sur la fonction date_sub ici: http://www.w3schools.com/sql/func_date_sub.asp et aussi de faire quelques SELECT SELECT date_sub (date_ordered, INTERVAL X DAY) des requêtes de commandes FROM pour vous assurer de comprendre comment fonctionne ce calcul, en pratique Maintenant, je reçois ma liste de commandes pour la dernière année. X jours (7 dans la requête ci-dessus) et je me joins à la table des commandes pour obtenir les produits qui ont été commandés. Ici, je veux déduire mes produits, essentiellement. 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 veux pas joindre 70 enregistrements et 50 enregistrements à ma table de produits pour les ID de produit 300 et 200, donc je les dédis. Cette dernière déclaration GROUP BY fait cela. C'est fonctionnellement identique à l'écriture de DISTINCT (bien qu'il puisse y avoir des différences mineures dans la façon de les calculer dans certaines circonstances, aucune de ces circonstances ne s'applique ici ... utilisez DISTINCT si cela vous est plus clair)

ma liste d'identifiants de produits uniques qui ont été commandés au cours des X derniers jours, je joins cela avec ma table de produits. Ici, j'utilise une jointure à gauche. Comme les commentaires ci-dessus, vous voudrez examiner la notion de jointures avec attention. Faites-le, si vous ne l'avez pas déjà fait. Enfin, j'applique un filtre WHERE qui dit "WHERE d.product_id IS NULL". Qu'est-ce que cela fait, c'est de dire, "ok, si product_id = Y a été commandé dans les X derniers jours, alors il se joindra à ma table de produits avec succès avec a.product_id = d.product_id.S'il n'a pas été commandé, alors un.product_id existe dans mon jeu de résultats, mais pas dans d.product_id. C'est, d.product_id sera nulle. »

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

Hope this helps.

+0

Bonjour evanv. Merci beaucoup d'avoir pris le temps d'écrire votre explication! Vous frappez le clou sur la tête. J'ai pu interroger chaque partie séparément, puis utiliser php pour obtenir la liste finale des produits qui n'ont pas été vendus mais je n'ai pas pu tout obtenir dans une requête SQL. Votre explication de la torsion était parfaite. JE VOUS REMERCIE! J'en apprendrai plus sur les jointures et la date_sub(). S'il y a un moyen de me faire savoir votre paypal addy je serais très heureux de vous tirer quelques dollars pour une bière, un café, un shake végétarien, ou autre chose. J'apprécie vraiment votre aide. –

+0

Heureux que cela a fonctionné. En ce qui concerne dire merci, absolument pas besoin d'envoyer de l'argent ou quelque chose comme ça. J'ai posé des questions et obtenu des réponses sur Stack Overlflow aussi. Si vous voulez vraiment dire merci, continuez à revenir. Posez des questions lorsque vous avez besoin d'aide. Réponds à ceux que tu peux. SO est un super endroit. Bienvenue au club. J'espère que vous resterez une partie et continuer à revenir avec des questions et des réponses au fur et à mesure qu'elles se présentent à vous. – evanv