2016-02-14 39 views
0

我正在为客户端构建一个报告模块,而他们当前的过程使得我很难做到我正在尝试做的事情。数据库是MySQL,模块是用PHP编写的。选择MySQL中某个记录的下一次出现

本质上,我需要找到一个处理请求日期之间的订单。够简单。然后,我需要在第一时间发现它的状态设置为航运,因为它可以处理和运输之间设置来回多次,如果返回的顺序或warrantied等

但是,我需要这个在两个单独的查询中完成。

我可以得到他们正在处理的订单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

+0

为什么两个查询? – Strawberry

+0

@Strawberry我需要从第一个编译所有ID的列表,无论他们是否已发货,然后如果他们已发货,我需要额外的信息。 – David

+0

这通常是带外连接的单个查询。考虑提供一些示例数据(理想情况下为sqlfiddle)和期望的结果,作为对您问题的编辑。 – Strawberry

回答

1

不要GROUP BY使用SELECT *。这是一个糟糕的质疑和思维模糊的迹象。所有列的值来自哪里?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; 

注意:您可能不需要两个查询。您应该能够使用子查询来生成列表并在此查询中使用它。

而且,如果您需要完整记录,则将此结果集加回原始表。

+0

感谢您的回复。 我做了Group By,因为在同一天可能有5或6个订单设置为处理。我只想要最近的。 我的问题是没有得到第一次发货日期。我可以做。鉴于处理发生,它正在从表格中获得下一次发货。 – David