php mysql显示/获取客户订购的所有产品,这些产品由ORDER_DATE按2个表使用join分组

时间:2013-03-15 18:35:17

标签: php mysql left-join inner-join

我有两张表CARTORDERS。我想显示/获取由ORDER_DATE分组的客户订购的所有产品如何通过加入这两个表来实现这一目标?或者它的正确代码,脚本或语法是什么..这是1:n关系我还想显示客户订购的商品ORDERED BY order_date ..

CART表:

  • cart_id
  • PRODUCT_ID
  • USER_ID
  • PROD_NAME
  • 图像

ORDER表:

  • ORDER_ID
  • cart_id
  • USER_ID
  • CUSTOMER_NAME
  • order_date的

2 个答案:

答案 0 :(得分:4)

如果您希望按订单日期(未分组)列出所有订购的商品,那么它将是这样的:

SELECT * 
FROM `order` 
LEFT JOIN cart ON cart.cart_id=`order`.cart_id 
ORDER BY order_date ASC

或:

SELECT * 
FROM cart 
LEFT JOIN `order` ON `order`.cart_id=cart.cart_id
ORDER BY order_date ASC

从结构看起来,购物车似乎可以包含多个订单(而订单不能包含更多购物车) - 这是您必须告诉我们的地方,是否是1:n关系(这两个表中)或是否为1: 1(在这种情况下,您不需要cart_id,可以使用order_id作为两个表中的链接元素)

如果你想要对它进行“分组”,那么你将不得不牺牲细节(这将被分组在一起)分组是有用的,如果你想看到所有订单的总价值 - 但这样做,您只会看到总价值,但不会看到每个订单中的商品(不是逐行查看)

编辑:
[抱歉,我忘了..这是一个1:n的关系..我还需要显示每个客户的订购商品..这可能吗? :)]

在这种情况下,假设主表是“顺序”,结构似乎不太合理,那么带有详细信息的表应该包含对主表的引用:

CART表:

  • cart_id
  • order_id (已添加)
  • PRODUCT_ID
  • USER_ID
  • PROD_NAME
  • 图像

订购表:

  • ORDER_ID
  • cart_id (已删除)
  • USER_ID
  • CUSTOMER_NAME
  • order_date的

你的问题再一次不是很清楚。你想看到用户购买的物品按照物品分组(也就是说,如果明天他们买一支铅笔,明天又买一支铅笔,你会看到两行结果类似于:

item   | qty
-------+----
pencil | 2  
rubber | 1

然后使用:

SELECT `order`.*, product_id, product_name, SUM(quantity) AS qty 
FROM `order` 
LEFT JOIN cart ON cart.order_id=`order`.order_id
GROUP BY product_id
ORDER BY product_name

答案 1 :(得分:3)

Juan,我真的很长,我不确定Stack Overflow网站是否适用于这种对话,但我会再次尝试解释。我会简化你的表格,所以我在这里发布的代码很简单。

CREATE TABLE orders (
    orderID int unsigned not null auto_increment,
    user int unsigned not null,
    PRIMARY KEY (orderID)
);

CREATE TABLE orderitems (
    oiID int unsigned not null auto_increment,
    order int unsigned not null,
    item int unsigned not null,
    PRIMARY KEY (oiID)
);

以上假设有一个用户表(用户姓名和电子邮件等在哪里)和项目表(项目名称和项目价格在哪里)。

我也假设(错误的,但为了简单起见),在我的情景中,没有人会想要购买超过1件我销售的任何物品,而且没有人愿意购买更多物品同时超过3项。

然后我的HTML条目形式就足够了,因为用户必须在订购时登录(因此我已经知道他们的用户ID - 并且它保存在我的php $ _SESSION ['userID']全局变量中),顺序在用户单击CHECKOUT按钮(提交表单)时总是动态分配,因此我们需要用户输入的唯一内容是项ID(或者更确切地说,从下拉列表中选择它)。

所以这里的表格非常简单:

<form action='orderit.php' method='post'>
    <select name='item[]'>
        <option value='' selected='selected'>Pick an item from the list!</option>
        <option value='1'>Knife</option>
        <option value='2'>Spoon</option>
        <option value='3'>Lava lamp</option>
        <option value='4'>HB pencil</option>
    </select><br/>
    <select name='item[]'>
        <option value='' selected='selected'>Pick an item from the list!</option>
        <option value='1'>Knife</option>
        <option value='2'>Spoon</option>
        <option value='3'>Lava lamp</option>
        <option value='4'>HB pencil</option>
    </select><br/>
    <select name='item[]'>
        <option value='' selected='selected'>Pick an item from the list!</option>
        <option value='1'>Knife</option>
        <option value='2'>Spoon</option>
        <option value='3'>Lava lamp</option>
        <option value='4'>HB pencil</option>
    </select><br/><br/>
    <input type='submit' value=' Checkout ' name='do'/>
</form>

从上面您可以看到,当用户点击结帐时所有数据(即客户所做的选择被发送到设置为action的{​​{1}}。请注意我并不困扰关于确保用户提交有效信息并且我没有使用最新技术(即msqli)而不是我正在使用已弃用的mysql例程。

所以接下来是:

orderit.php

就是这样。

请注意,我现在正在编写此代码,因此可能存在拼写错误或其他类型的错误。把它当作一个近似的指南,而不是一段工作的代码。