我正在为客户构建一个报告模块,他们当前的流程使得我很难完成我想做的事情。数据库是MySQL,模块是用PHP编写的。
本质上,我需要找到在请求的日期之间正在处理的订单。够简单的。然后,我需要找到它的状态第一次设置为发货的时间,因为它可能会在处理和发货之间来回设置多次,如果订单被退回或保修等。
但是,我需要在两个单独的查询中完成此操作。
我可以获取他们正在处理的订单 ID。我的问题是第二个查询,我正在做:
SELECT * FROM status_history WHERE orders_id IN {list_of_ids} AND status = 'shipped' GROUP BY orders_id
.
我的问题是此查询生成的“已发货”状态行可能位于所需状态行之前/之后。
我知道主要问题在于他们的流程以及我必须使用的遗留系统,但我无法更改。
我需要做的是:
SELECT * FROM status_history WHERE orders_id IN <list_of_ids> AND status = 'shipped' AND date_added > {date at processing} AND date_added < {date at next occurrence of processing, if there is one} GROUP BY orders_id
最佳答案
请勿将SELECT *
与GROUP BY
一起使用。这是不好的询问和不清晰的思维的表现。所有列的值从哪里来——那些不在 GROUP BY
子句中的值?
如果您想要第一次发货的日期,那么您可以获得该日期:
SELECT sh.orders_id, MIN(date_aded) as FirstShippedDate
FROM status_history sh
WHERE sh.orders_id IN <list_of_ids> AND sh.status = 'shipped' AND
sh.date_added > {date at processing} AND
sh.date_added < {date at next occurrence of processing, if there is one}
GROUP BY orders_id;
注意:您可能不需要两个查询。您应该能够使用子查询来生成列表并在此查询中使用它。
并且,如果您需要完整的记录,请将此结果集连接回原始表。
关于php - 选择 MySQL 中某个记录的下一个出现位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35399504/