【问题标题】:SQL select orders depending on status and dateSQL 根据状态和日期选择订单
【发布时间】:2014-04-29 11:27:04
【问题描述】:

我有一个类似于以下的表 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 年 4 月 1 日之前收到但之后发货的唯一订单。

我什至无法开始...非常感谢任何帮助、提示或指针。

【问题讨论】:

  • 你当然可以尝试一下

标签: mysql sql opencart


【解决方案1】:

您可以这样做,通过加入您的表格并使用 sum 中的表达式计算每个订单运送的雕像,即 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

【讨论】:

    【解决方案2】:

    你可以使用 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)
    

    【讨论】:

      【解决方案3】:
      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';
      

      注意:添加的“d”过多

      【讨论】:

        【解决方案4】:
        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

        【讨论】:

          【解决方案5】:

          这个简单轻量的查询怎么样:

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

          【讨论】:

            【解决方案6】:

            未测试,但试试这个:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-04-24
              • 1970-01-01
              • 2023-03-13
              • 1970-01-01
              • 2021-02-16
              相关资源
              最近更新 更多