如何根据是否存在第三个记录来查询两个表?

时间:2009-09-14 20:41:57

标签: php sql mysql

我有三张桌子,前两张是相当标准的:

1)PRODUCTS表:

  • PID
  • pname等

2)CART表:

  • cart_id
  • cart_pid
  • cart_orderid等

第三种方法是让人们保存他们购买的产品并记录下来。

3)MYPRODUCTS表:

  • myprod_id
  • myprod_pid

产品。prod_id = CART。cart_prodid = MYPRODUCTS。myprod_pid

当用户订购时,他们会在订单中看到产品列表,并可以选择将该产品添加到我的产品中。 我正在获取他们执行此操作所需的信息,每个订单都有一个类似的查询:

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

第一次订购时这很好。

但是,如果他们随后重新订购了他们已经添加到myproducts的产品,那么他们就不可能再次将其添加到myproducts - 基本上不是'添加到MyProducts'他们需要看到'在MyProducts中查看”。

我想我可以使用两个查询来分隔产品:

  1. 产品从未添加到MyProducts

    以某种方式识别用户是否已在MyProducts中拥有该产品,如果是,则将其从上述查询中排除。

  2. MyProducts中的产品

    通过颠倒上述过程。

  3. 我需要一些关于如何做到这一点的指示。

2 个答案:

答案 0 :(得分:0)

他们之前订购的产品:

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

他们从未订购的产品

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

以上查询可能会更自然地作为NOT IN语句阅读,以便遵循。我已经优先考虑上述因素,因为它很可能是一种更快的操作。

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

答案 1 :(得分:0)

您的myproducts表中是否需要用户名?

这不会解决您的具体问题,但您是否考虑过更改用户界面?也许用户不应该控制他们购买的产品列表。这似乎是您不必要地使您的界面复杂化。您可以自动将他们订购的每件产品添加到“我的产品”。

此外,我认为您应该跟踪用户订购了相同产品ID的产品数量。在myproducts表中放置一个“计数”字段以跟踪此情况。您不必实际使用此字段,但您最终可能会后悔不添加此字段。甚至更好 - 为每个添加的产品添加一个新行,以便您也可以跟踪日期/时间。