2014-04-29 120 views
0

SQL選擇命令我有一個表order_history類似於以下內容:根據狀態和日期

+-------------------------------------------------------------+ 
| order_history_id | order_id | order_status_id | date_addded | 
+-------------------------------------------------------------+ 
| 1    | 1  | 1    | 2014-03-20 | 
| 2    | 1  | 2    | 2014-03-21 | 
| 3    | 1  | 3    | 2014-03-29 | 
| 4    | 2  | 1    | 2014-03-20 | 
| 5    | 2  | 2    | 2014-03-21 | 
| 6    | 2  | 3    | 2014-04-02 | 
| 7    | 3  | 1    | 2014-04-20 | 
| 8    | 3  | 2    | 2014-04-21 | 
| 9    | 3  | 3    | 2014-04-22 | 
+-------------------------------------------------------------+ 

的ORDER_STATUS表示爲了

+-------------------------------+ 
| order_status_id | name  | 
+-------------------------------+ 
| 1    | received | 
| 2    | processed | 
| 3    | shipped  | 
+-------------------------------+ 

什麼我想要做的狀態將在2014年4月1日之前退出所有收到的訂單,但在2014年4月1日之後才能發貨。

因此,在這種情況下,查詢將僅返回order_id 2,因爲這是在2014-04-01之前收到的唯一訂單,但尚未發貨。

我似乎無法開始...任何幫助,提示或指針非常讚賞。

+1

你肯定可以試一下 – Strawberry

回答

3

你可以這樣做,通過連接你的表格和計通過使用表達式求和的每個訂單的雕像即SUM(os.name ='shipped') shipped

SELECT o.* 
,SUM(os.name ='shipped') shipped 
FROM 
orders o 
LEFT JOIN orders_status os USING(order_status_id) 
WHERE o.date_addded < '2014-04-01' 
GROUP BY o.order_id 
HAVING shipped =0 

Fiddle Demo

+1

好的答案,+1! –

0

您可以使用INNER JOIN這一點,如果我得到你真正想要的,你可以試試這個什麼:

SELECT DISTINCT order_id 
FROM order_history A 
INNER JOIN order_status B 
ON A.order_status_id = B.order_status_id 
WHERE (A.order_Status_id = '1' AND A.date_added < @date) AND (A.order_status_id = '3' AND A.date_added < @date) 
0
SELECT r.order_id 

FROM (
    SELECT DISTINCT oh.order_id 
    FROM order_history AS oh 
    JOIN order_status AS os ON(oh.order_status_id = os.order_status_id) 
    WHERE os.name = 'received' 
     AND oh.date_addded < '2014-04-01' 
) AS r 

JOIN (
    SELECT DISTINCT oh.order_id 
    FROM order_history AS oh 
    JOIN order_status AS os ON(oh.order_status_id = os.order_status_id) 
    WHERE os.name = 'shipped' 
     AND oh.date_addded > '2014-04-01' 
) AS s ON (s.order_id = r.order_id) 

demo

0
SELECT h1.order_id 
    FROM order_history h1 
    JOIN order_status s1 
    ON s1.order_status_id = h1.order_status_id 
    JOIN order_history h2 
    ON h2.order_id = h1.order_id 
    JOIN order_status s2 
    ON s2.order_status_id = h2.order_status_id 
WHERE h1.date_addded < '2014-04-01' 
    AND s1.name = 'received' 
    AND h2.date_addded >= '2014-04-01' 
    AND s2.name = 'shipped'; 

注:addded

0

這個怎麼樣簡單清淡的查詢太多的「D'S:

SELECT DISTINCT order_id 
FROM order_history o1 
JOIN order_history o2 
ON o1.order_id = o2.order_id 
AND o1.order_status_id=1 AND o1.date_added<'2014-04-01' 
AND o2.order_status_id=3 AND o2.date_added>'2014-04-01'; 
0

沒有測試,但試試這個:

SELECT A.ORDER_ID 
    FROM ORDER_HISTORY A, ORDER_HISTORY B 
WHERE A.ORDER_ID = B.ORDER_ID  
     AND A.order_status_id = 1 
     AND A.date_addded < TO_DATETO_DATE ('2014-04-01', 'YYYY-MM-DD') 
     AND B.order_status_id = 3 
     AND B.date_addded > TO_DATETO_DATE ('2014-04-01', 'YYYY-MM-DD');