2016-02-14 37 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