繁体   English   中英

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

[英]php mysql display/get all the products ordered by the customer grouped by ORDER_DATE from 2 tables using join

我有这两个表CARTORDERS 我想显示/获取按ORDER_DATE分组的客户订购的所有产品,如何通过合并这两个表来做到这一点? 或正确的代码,脚本或语法是什么。.这是1:n关系,我也想显示客户订购的商品ORDERED BY order_date。

CART表:

  • cart_id
  • product_id
  • 用户身份
  • prod_name
  • 价钱
  • 数量
  • 图片

ORDER表:

  • order_id
  • cart_id
  • 用户身份
  • 顾客姓名
  • 订购日期

如果您要列出按订购日期排序的所有商品(未分组),则可能是这样的:

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作为两个表中的链接元素)

万一您想对其进行“分组”,那么您将不得不牺牲细节(将其分组在一起),如果您想查看所有订单的总价值,分组是有用的-但是这样做,您将仅查看总计值,但不查看每个订单中的项目(不在逐行视图中)

编辑:

在那种情况下,假设主表是“ order”,则结构看起来并不健全,那么具有详细信息的表应包含对主表的引用:

购物车表:

  • cart_id
  • order_id (添加)
  • product_id
  • 用户身份
  • prod_name
  • 价钱
  • 数量
  • 图片

订单表:

  • order_id
  • cart_id (已删除)
  • 用户身份
  • 顾客姓名
  • 订购日期

同样,您的问题不是很清楚。 您是否要查看用户购买的商品,并按商品分组(即,如果他们今天买了一支铅笔,明天又买了另一支铅笔,则您将看到两行类似的结果:

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

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输入表单就足够简单了,因为用户必须在订购时登录(因此我已经知道了他们的userID-并且它保存在我的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被设置为orderit.php 。请注意,我不打扰关于确保用户submiting有效信息而且我没有使用最新的技术(即msqli),而是使用了已弃用的mysql例程。

因此,它如下所示:

<?php
     //here you will have your database opened, session initiated and so on
     // $db contains the database connection handler
     // $_POST['userID'] contains valid user's id

     if (isset($_POST['item']) && count($_POST['item'])>0) {
         //they ordered something we can create the order
         $q=mysql_query("INSERT INTO orders SET user='".mysql_real_escape_string($_SESSION['userID'])."'",$db);
         if (!$q)
             die("An error while creating new order");
         $orderID=mysql_insert_id($db); //fetch the just-now created order's ID
         foreach($_POST['item'] as $item) { //go through all the ordered items
            $q=mysql_query("INSERT INTO orderitems SET order='$orderID', item='".abs((int) $item)."'");
            if (!$q)
                die("Couldn't save item $item of order #$orderID");
         }
         print "Your order was saved successfuly!";
     } else
         die("This is an empty order");
?>

就这样。

请注意,我现在是从头开始编写此代码,因此可能存在输入错误或其他类型的错误。 将其更多地作为一个大概的指南,而不是作为一个有效的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM