mysql - SQL 查询 - 从 3 个表中查询 ID 顺序

标签 mysql sql

我想根据下表导出记录。

de_orders(date_add 是订单创建)

id_order  |   id_carrier  |        date_add  
    5     |        1      |    2017-10-24 09:14:51
    6     |        2      |    2017-10-25 10:14:51
    7     |        3      |    2017-10-26 08:14:51

de_order_history

id_order  |   id_order_state |        date_add
    5     |        2         |   2017-10-24 10:14:51
    5     |        3         |   2017-10-24 11:14:51
    5     |        4         |   2017-10-24 12:14:51

de_carrier

    id_carrier  |   name  
        1       |   XXX
        2       |   YYY
        3       |   ZZZ

目前我只能得到一个约会对象。

id_order  |  id_carrier |  date_add(from orders) | date_add (from id_order_state (4))
    5     |     XXX     |   2017-10-24 09:14:51  |       2017-10-24 12:14:51

使用下面的查询:

SELECT
o.id_order AS ID,
o.date_add AS Order_date,
h.date_add AS Delivered_date,
c.name AS carrier_name
FROM de_orders o
LEFT JOIN de_order_history h ON (o.id_order=h.id_order)
LEFT JOIN de_carrier c ON (o.id_carrier=c.id_carrier)
WHERE  YEAR(o.date_add) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(o.date_add) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) 
AND h.id_order_state="4"
GROUP BY o.id_order
ORDER BY o.id_order

我想导出以下内容:

期望的结果(返回所有记录,其中 id_order_state = 4)

id_order  |  id_carrier |  date_add(from orders) | date_add (from id_order_state (3)) | date_add (from id_order_state (4))
    5     |     XXX     |   2017-10-24 09:14:51  |       2017-10-24 11:14:51          |        2017-10-24 12:14:51

我是不是看错了?

谢谢。

最佳答案

通过将 id_order_state WHERE 条件移动到内联 CASE 语句中来考虑条件聚合。此外,您的 GROUP BY 现在包括 Order_date 以便在 SQL ANSI 语法上正确,其中非聚合列必须包含在 GROUP BY: 子句中:

SELECT o.id_order AS ID, 
       c.`name` AS ID_Carrier,
       o.date_add AS Order_date, 
       MAX(CASE 
                WHEN h.id_order_state='3' 
                THEN h.date_add 
           END) AS ID_Order_State_3_Deliver_date,
       MAX(CASE 
                WHEN h.id_order_state='4' 
                THEN h.date_add 
           END) AS ID_Order_State_4_Deliver_date,
       c.name AS carrier_name
FROM de_orders o
LEFT JOIN de_order_history h ON (o.id_order=h.id_order)
LEFT JOIN de_carrier c ON (o.id_carrier=c.id_carrier)
WHERE YEAR(o.date_add) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) 
  AND MONTH(o.date_add) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)     
GROUP BY o.id_order, c.`name`, o.date_add
ORDER BY o.id_order, c.`name`, o.date_add

关于mysql - SQL 查询 - 从 3 个表中查询 ID 顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47311606/

相关文章:

PHP OOP MySQL (WAMP) 变量作用域

c# - Mysql数据库副本供离线使用

mysql - 表之间的 SQL 右连接

sql - 如何在模型上放置多个默认范围?

mysql - 如何计算类别中的产品

mysql - 高级 mysql 查询,它对结果集上的特定记录进行排序,而不考虑其默认排序?

mysql PDO where like or query 只返回 1 个结果

sql - 对 has_many 进行反向查询 :through

sql - 全文搜索与 LIKE

sql - 转换语句内的结果