2009-09-14 4 views
0

J'ai trois tables, les deux premières assez standard:Comment interroger deux tables selon que l'enregistrement existe ou non dans un tiers?

1) PRODUCTS table:

  • pid
  • pname, etc

2) CART table:

  • cart_id
  • cart_pid
  • cart_orderid etc

Le troisième est conçu pour permettre aux gens de mettre les produits qu'ils achètent et de garder des notes sur eux.

3) MYPRODUCTS Tableau:

  • myprod_id
  • myprod_pid

PRODUITS. prod_id = PANIER. cart_prodid = MYPRODUCTS. Lorsqu'un utilisateur passe une commande, une liste de produits est présentée sur sa commande et il peut éventuellement ajouter ce produit à myproducts. Je reçois les informations nécessaires pour leur faire cela, avec quelque chose de requête comme ceci pour chaque commande:

SELECT cart.pid, products.pname, products.pid 
FROM products, cart 
WHERE products.pid = cart_prodid 
AND cart_orderid=orderid 

Ceci est bien la première fois qu'ils commandent. Cependant, s'ils réordonnent par la suite un produit qu'ils ont déjà ajouté à mes produits, il NE devrait PAS leur être possible de les ajouter à nouveau à mes produits. En fait, au lieu de 'Ajouter à Mes Produits' ils doivent voir 'Voir dans MyProducts '.

Je pense que je peux séparer les produits en utilisant deux requêtes:

  1. Produits jamais ajouté à myProducts

    En identifiant en quelque sorte si l'utilisateur a le produit dans myProducts déjà, et si oui excluant de la requête ci-dessus.

  2. produits déjà en myProducts

    En inversant le processus ci-dessus.

J'ai besoin de pointeurs sur la façon de procéder.

+0

Vous devez modifier les définitions de table dans votre question pour obtenir une certaine cohérence sur pid vs prod_id. Vous feriez également mieux de supprimer le préfixe par table sur les noms de colonnes et d'utiliser le même nom de manière cohérente pour le même attribut dans chaque table. Donc, si vous choisissez prod_id pour identifier le produit, alors vous utiliserez products.prod_id et cart.prod_id et myproducts.prod_id. –

+0

Vous devez également considérer où l'utilisateur est identifié. Vous semblez utiliser le tableau 'panier' à la fois pour la description de la commande (y compris peut-être l'identifiant client) et pour les articles de la ligne de commande - les articles commandés. Le design n'est pas encore entièrement normalisé. Aussi, pour le moment, je ne vois pas les avantages de la table MyProducts; pourquoi ne pas simplement regarder à travers une liste de ce qu'ils ont commandé récemment des charrettes précédentes? Vous mentionnez des 'commentaires', mais vous ne les montrez pas. –

Répondre

0

produits qu'ils ont commandés avant:

SELECT cart.pid, products.pname, products.pid 
from products p 
inner join cart c on p.prodid = c.cart_prodid 
WHERE cart_orderid=orderid 

produits qu'ils ont jamais commandé avant

SELECT products.pname, products.pid 
from products p 
left join myproducts mp ON p.prodid = mp.prodid 
WHERE mp.prodid IS NULL 

La requête ci-dessus peut lire plus naturellement comme une déclaration NOT IN, qui est à suivre. J'ai priorisé ce qui précède parce que c'est probablement une opération plus rapide.

SELECT products.pname, products.pid 
from products p 
WHERE p.prodid NOT IN 
(
    SELECT prodid 
    FROM myproducts 
) 
0

Ne vous besoin d'un ID utilisateur dans votre table myproducts?

Cela ne va pas répondre à votre problème spécifique, mais avez-vous envisagé un changement dans l'interface utilisateur? Peut-être que l'utilisateur ne devrait pas contrôler sa liste de produits achetés. Cela semble vous compliquer inutilement votre interface. Vous pouvez ajouter automatiquement tous les produits commandés à "Mes produits".

En outre, je pense que vous devriez garder une trace du nombre de produits commandés par l'utilisateur pour le même ID de produit. Mettez un champ "count" dans le tableau myproducts pour garder une trace de cela. Vous ne devez pas réellement utiliser ce domaine, mais vous pourriez éventuellement regretter de ne pas l'ajouter. Ou encore mieux: ajoutez une nouvelle ligne pour chaque produit ajouté afin de pouvoir également suivre la date et l'heure.

+0

Je sais que cela semble bizarre de vouloir le faire - mais croyez-moi, dans le contexte de ce site, c'est tout à fait logique. L'idée du compte est brillante - je n'y avais pas pensé. Je vous remercie! – Katherine

Questions connexes