mysql - 连接 4 个表导致空结果
问题描述
我有 4 张桌子,每张桌子都有这个细节
熟食订单表
order_code | code | plat_create_time | status
OC001 C001 2019-04-14 Success
OC002 C002 2019-04-14 Success
OC003 C003 2019-04-14 Success
pg_order 表
id |order_code | code | plat_create_time
1 OC001 C001 2019-04-14
2 OC002 C002 2019-04-14
3 OC003 C003 2019-04-14
pg_package 表
pg_order_id | plat_create_time | cm_sign_time
1 2019-04-14 2019-04-14
2 2019-04-14 2019-04-14
3 2019-04-14 -
pg_send_package 表
order_code | code | plat_create_time | lp_sign_time
OC001 C001 2019-04-14 -
OC002 C002 2019-04-14 -
OC003 C003 2019-04-14 2019-04-14
我需要计算具有“cm_sign_time”或“lp_sign_time”的交易数据。pg_package 表需要先连接到 pg_order,然后才能连接到 deli_order 表。
首先,我尝试先将 pg_send_package 表与 deli_order 表连接起来。这是我的查询
SELECT
DATE(A.create_time) AS 'Create Time',
SUM(CASE
WHEN B.lp_sign_time IS NOT NULL THEN 1
ELSE 0
END) AS 'Completed Order'
FROM
deli_order A
INNER JOIN pg_send_package B ON B.order_code = A.order_code AND B.code = A.code
WHERE DATE(A.plat_create_time) = '2019-04-14'
GROUP BY DATE(A.plat_create_time);
和结果
Create Time | Completed Order
2019-04-14 130
但是当我加入另外两张桌子时,我得到的结果什么都没有。这是我的查询
SELECT
DATE(A.plat_create_time) AS 'Create Time',
SUM(CASE
WHEN B.lp_sign_time IS NOT NULL THEN 1
WHEN D.cm_sign_time IS NOT NULL THEN 1
ELSE 0
END) AS 'Completed Order'
FROM
deli_order A
INNER JOIN pg_send_package B ON B.order_code = A.order_code AND B.code = A.code
INNER JOIN pg_order C ON C.order_code = A.order_code AND C.oms_code = A.code
INNER JOIN pg_package D ON D.pg_order_id = C.id
WHERE
DATE(A.plat_create_time) = '2019-04-14'
GROUP BY DATE(A.plat_create_time);
这是结果
Create Time | Completed Order
我需要对具有“lp_sign_time”或“cm_sign_time”的事务的计数结果求和。
我的预期结果是
Create Time | Completed Order
2019-04-14 150
150 来自 130 笔带有“lp_sign_time”的交易和 20 笔带有“cm_sign_time”的交易 我应该在查询中更改什么?
解决方案
您可以尝试使用UNION ALL
combinepg_send_package
和 pg_package
table 为order_code,code,lp_sign_time
then 做一个OUTER JOIN
结果集COUNT
。
SELECT DATE(A.plat_create_time) AS 'Create Time',
COUNT(lp_sign_time) AS 'Completed Order'
FROM deli_order A
LEFT JOIN
(
SELECT order_code,
code,
lp_sign_time
FROM pg_send_package psp
UNION ALL
SELECT C.order_code,
C.code,
pp.cm_sign_time
FROM pg_package pp
INNER JOIN pg_order C ON pp.pg_order_id = C.id
) t1 ON t1.order_code = A.order_code
AND t1.code = A.code
AND DATE(A.plat_create_time) = '2019-04-14'
GROUP BY DATE(A.plat_create_time);
推荐阅读
- php - 查找键数组 / sub_array php
- ios - 无法在可扩展的tableview iOS swift中添加动态数据?
- ms-access - 在 VBA 中定义复杂的静态数据
- c# - ListBox 忽略新设置的 ItemsSource
- gitlab - 我可以通过 API 在 gitlab repo 中上传整个文件夹吗?
- mysql - 在腻子中运行 file.sql 文件时出现错误 1064 (42000)
- javascript - Reactjs在Android浏览器上显示空白屏幕
- node.js - 超级账本结构:由于缺少配置数据,网络配置无效
- android - Kotlin 单例:如何从单例中复制对象
- java - 如何永久增加java堆大小