如何使用 Group By 对数据库表进行分组

Posted

技术标签:

【中文标题】如何使用 Group By 对数据库表进行分组【英文标题】:How to group database tables using Group By 【发布时间】:2015-07-03 21:48:43 【问题描述】:

我正在开发一个简单的 php 购物车站点,该站点连接到名为 products 的数据库,并具有表 Orders、user、products。订单表具有以下字段: OrderId、product_id、user_id、数量...当用户订购例如 3 个产品时。数据是从SESSION['cart']插入的下面是查询

$query = "insert into orders (product_id,user_id,Quantity) values ('$key','$id','$value')"; 
                mysql_query($query);

现在的问题是,如果用户订购了多个产品,则会生成三个 orderID,因为他订购了 3 个产品,每个 orderId 都指向该产品。当我使用 select 语句时,它会显示用户的所有订单,但我想对它们进行分组,这样如果有人一次订购超过 1 个产品,列表将显示单个 orderID,但用户订购的所有产品它。下面是来自订单表的数据库表记录图像和我正在使用的选择查询..

OrderId  product_id  user_id  Quantity  

  1           4        1           1
  3          21        1           3
  4          19        1           1
  5          21        1           3
  6          19        1           2

$sql1=mysql_query("SELECT * FROM orders,USER WHERE user.`user_id`=orders.`user_id`"); 

    while($row = mysql_fetch_array($sql1))
    
        $sReturn .='
                <tr>
                <td>' . $row['user_id'] . '</td>
                <td>' . $row['OrderId'] . '</td>
                <td>' . $row['product_id'] . '</td>
                <td>' . $row['Quantity'] . '</td>
                </tr>';
       

有人告诉我可以使用什么选择查询 groupby with sum ..

【问题讨论】:

你能展示一个你想要的样例输出吗? 你不应该使用订单ID作为自动增量...... 我想显示一个表格,我可以在其中查看用户列表以及 order_id...我在下面提出了一个查询,它给出了用户的 user_id 和 NumberofOrders,我还想要数量总结.. SELECT user.user_id,COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders LEFT JOIN USER ON Orders.user_id=user.user_id GROUP BY username; @BabarAli 您无法使用此结构检索订单 ID。 车轮需要重新设计,但为什么要改造这个? 【参考方案1】:

这将根据product_id得到每个用户的产品总和

更新

 SELECT SUM( orders.Quantity ) , COUNT( orders.order_id ) , orders.user_id
    FROM  orders join user on (user.`user_id`=orders.`user_id`) 
    GROUP BY orders.user_id

【讨论】:

它会产生错误,。查询有问题 没有尝试过小,大写..仍然出现错误错误代码:1052 字段列表中的列'user_id'不明确 是的,我已经更改了我的查询,您现在可以查看。实际上,用户表中有一个字段 user_id,这也是为什么它显示“错误代码:字段列表中的 1052 列 'user_id' 不明确” Thankyou Habib,您的查询现在工作正常,但仍然不是我想要的......它显示 user_id 三次所以,我将在用户订单页面的详细信息中使用它......当管理员点击在用户订单历史记录中,您的查询将起作用...我已经弄清楚了查询..正在回答问题 @BabarAli 你让我很困惑,你发布的答案不是你的问题告诉我们的??我已经改变了我的答案,现在终于我想这就是你想要的......【参考方案2】:

您需要添加一个名为 OrderItem 或 OrderRow 的表格,在其中放置每个订单的产品信息。字段可以是 OrderID、ProductID、Quantity、ItemPrice。

最好把你下单时告诉客户的价格保存下来,不然以后改价格的时候会出很多问题。

【讨论】:

首先我想创建一个存储 user_id order_id 的桥表,我有一个名为 orders 的表,其中包含以下字段 (orderID,product_id,user_id,quantity) .. 如果我将价格列添加到此表中......因为产品表中提到了价格。 当顾客在商店时显示产品的价格。在他们购买后,您可能有一个他们的订单页面。您可以使用他们订单中的价格。 知道了 .,.. 感谢 idstam :) .. 将添加价格产品字段 .. 并在订单页面从订单表中选择价格【参考方案3】:

您需要修复您的order_id - 它不能是自动增量的。那么这就是我认为您要问的问题。

select order_id, sum(quantity)
from orders
group by order_id

我已经省略了 where 子句,因为我不知道你想要什么过滤器。

【讨论】:

【参考方案4】:
SELECT * FROM user_table WHERE id =
(SELECT user_id FROM order_table WHERE order_id = n limit 1);

但如果您为包含订单信息的订单创建单独的表以及用于链接订单和产品(id、order_id、product_id、数量)的表,那就更好了。

【讨论】:

【参考方案5】:

我已经弄清楚了查询..下面是获取订单数量+数量或产品数量+用户ID的查询...

    SELECT user.`user_id`,SUM(quantity) AS Number_Of_Products,COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders
LEFT JOIN USER
ON Orders.user_id=user.`user_id`
GROUP BY username;

下面是输出

user_id  Number_Of_Products  NumberOfOrders  

  1                  10                 5

【讨论】:

以上是关于如何使用 Group By 对数据库表进行分组的主要内容,如果未能解决你的问题,请参考以下文章

【MySQL】分组查询(GROUP BY)

winform中如何对一个 datatable 中的数据 进行 分组统计 需要 count 和group by

mysql:group by,order by

如何使用group by 分组查询表中所有字段信息

如何在不使用 GROUP BY 或 PARTITION BY 的情况下对 Oracle SQL 中的数据进行分组

GROUP BY 相邻记录