SQL选择顺序取决于状态和日期

时间:2014-04-29 11:27:05

标签: mysql sql opencart

我有一个表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-04-01之前收到的所有订单,但直到2014-04-01之后才发货。

因此,在这种情况下,查询将返回order_id 2,因为这是2014-04-01之前收到的唯一订单。

我似乎无法开始......任何帮助,提示或指示都非常受欢迎。

6 个答案:

答案 0 :(得分: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 :(得分: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)

答案 2 :(得分: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

答案 3 :(得分: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';

注意:添加的内容太多了

答案 4 :(得分:0)

这个简单明了的查询怎么样:

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';

答案 5 :(得分: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');