Php 基于列的和返回行

Php 基于列的和返回行,php,sql,mysql,Php,Sql,Mysql,我试图根据一列的总和检索数据的子集。目标是生成一个脚本来发布缺货项。假设我们有100个BO产品,有50个库存。我想更新订单数量总和小于50的最旧订单。比如: 示例架构: Orders Table: order_id, order_date order_products Table: order_product_id, order_id, product_id, product_status, ordered_quantity select * from products where pr

我试图根据一列的总和检索数据的子集。目标是生成一个脚本来发布缺货项。假设我们有100个BO产品,有50个库存。我想更新订单数量总和小于50的最旧订单。比如:

示例架构:

Orders Table:
order_id, order_date

order_products Table:
order_product_id, order_id, product_id, product_status, ordered_quantity


select * from products 
where products_id=1234 
and status=1 
and sum(products_qty) < 50;   
订单表: 订单号,订单日期 订单产品表: 订单产品标识、订单标识、产品标识、产品状态、订单数量 从产品中选择* 其中products_id=1234 和状态=1 和总和(产品数量)<50;
其中sum(products_qty)是返回的总数量,而不仅仅是单个行的数量。我不确定单次查询或甚至子查询是否可以实现这一点,但我想我会先问问这里的专家。我试图避免返回所有行,然后手动计数,直到达到限制。

您需要使用GROUP by和HAVE

select * from products 
where products_id=1234 
and status=1 
group by YourGroupingFields
Having sum(products_qty) < 50;   
从产品中选择*
其中products_id=1234
和状态=1
按分组字段分组
总和(产品数量)<50;
根据您的信息:

select product_id from products 
where status=1 
group by product_id
Having sum(products_qty) < 50;   
从产品中选择产品\u id
其中status=1
按产品编号分组
总和(产品数量)<50;

将返回总数量小于50的产品id当您使用聚合函数(如
SUM()
COUNT()
)时,您不能在
WHERE
子句中使用它们。当数据库扫描表/索引时,WHERE子句被逐行应用,这意味着聚合函数的结果还不可用

必须使用
have
对聚合结果进行过滤,这基本上是将数据返回到客户端之前的最后一步

从您的需求的声音来看,您需要保持一个运行计数,直到您检索到足够的行/订单来使用输入的新产品。这不能用一个查询来完成。您需要使用服务器端变量来跟踪单个缺货订单“用完”了多少产品

在我脑子里,像这样的事情可能会起作用:

SET @Available = 50;

SELECT order_id, SUM(ordered_quantity), @Available := @Available - SUM(ordered_quantity) AS available
FROM order_products
WHERE product_id = XXX
GROUP BY order_id, product_id
HAVING available >= 0;

使用任何额外的WHERE子句,以便首先获得最早的缺货订单

您是否可以使用示例表模式更新您的问题?很接近-但我希望返回产品的前x行,直到总订购数量=50。所以,如果每个人只点了1行,那可能是50行;如果每个人都点了2行,那可能是25行,等等……这似乎是对的。我还需要引入另一个表,所以我已经开始使用PHP版本。