0

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

CART桌子:

  • cart_id
  • product_id
  • 用户身份
  • 产品名称
  • 价格
  • 数量
  • 图片

ORDER桌子:

  • order_id
  • cart_id
  • 用户身份
  • 全部的
  • 顾客姓名
  • 订购日期
4

2 回答 2

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_id
  • order_id (添加)
  • product_id
  • 用户身份
  • 产品名称
  • 价格
  • 数量
  • 图片

订单表:

  • order_id
  • 购物车 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
于 2013-03-15T18:43:46.407 回答
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设置为orderit.php. 请注意,我并不担心确保用户提交有效信息,我是不使用最新的技术(即 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");
?>

就这样。

请注意,我现在正在从头顶编写此代码,因此可能存在拼写错误或其他类型的错误。把它更多地作为一个大致的指南,而不是一个工作代码。

于 2013-03-16T18:28:08.557 回答