我想根据下表导出记录。
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/