我有这两张桌子CART
和ORDERS
. 我想显示/获取客户订购的所有产品,按ORDER_DATE
我如何通过加入这两个表进行分组?或者它的正确代码、脚本或语法是什么.. 这是一个 1:n 关系我还想显示客户订购的商品 ORDERED BY order_date..
CART
桌子:
- cart_id
- product_id
- 用户身份
- 产品名称
- 价格
- 数量
- 图片
ORDER
桌子:
- order_id
- cart_id
- 用户身份
- 全部的
- 顾客姓名
- 订购日期
我有这两张桌子CART
和ORDERS
. 我想显示/获取客户订购的所有产品,按ORDER_DATE
我如何通过加入这两个表进行分组?或者它的正确代码、脚本或语法是什么.. 这是一个 1:n 关系我还想显示客户订购的商品 ORDERED BY order_date..
CART
桌子:
ORDER
桌子:
如果您希望列出按订单日期订购的所有商品(未分组),那么它将是这样的:
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 关系..我还需要显示每个客户的订购物品..这可能吗?:)]
在这种情况下,假设主表是“订单”,那么结构似乎不是很合理,那么带有详细信息的表应该包含对主表的引用:
购物车表:
订单表:
你的问题又不是很清楚。您想查看用户购买的商品按商品分组吗(也就是说,如果他们今天买了一支铅笔,明天买了橡皮,后天买了另一支铅笔,你会看到两行类似的结果:
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 输入表单就足够简单了,因为用户在订购时必须登录(因此我已经知道他们的用户 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");
?>
就这样。
请注意,我现在正在从头顶编写此代码,因此可能存在拼写错误或其他类型的错误。把它更多地作为一个大致的指南,而不是一个工作代码。