mysql - 选择没有对应支付订单的重复支付挂单
问题描述
我的表结构是:
订单
+------+-------------+----------------+-------------+
| id | customer_id | payment_status | created_on|
+------+-------------+----------------+-------------+
| 1 | 1 | unpaid | 2018-12-28 |
| 2 | 1 | unpaid | 2018-12-29 |
| 3 | 2 | unpaid | 2018-12-29 |
| 4 | 2 | unpaid | 2018-12-29 |
| 5 | 4 | paid | 2018-12-30 |
| 6 | 3 | unpaid | 2018-12-30 |
+------+-------------+----------------+-------------+
order_items
+------+-----------+-------------+----------+-------+
| id | order_id | product_id | quantity | price |
+------+-----------+-------------+----------+-------+
| 1 | 1 | 4 | 2 | 20.50 |
| 2 | 1 | 5 | 2 | 25.00 |
| 3 | 2 | 4 | 2 | 20.50 |
| 4 | 2 | 5 | 2 | 25.00 |
| 5 | 3 | 1 | 1 | 20.00 |
| 6 | 3 | 2 | 1 | 25.00 |
| 7 | 4 | 1 | 1 | 20.00 |
| 8 | 4 | 2 | 1 | 25.00 |
| 9 | 5 | 4 | 2 | 20.50 |
| 10 | 5 | 5 | 2 | 25.00 |
| 11 | 6 | 3 | 4 | 15.00 |
+------+-----------+-------------+----------+-------+
顾客
+-----+---------------+----------+
| id | email | name |
+-----+---------------+----------+
| 1 | abc@mail.com | user 1 |
| 2 | xyz@mail.com | user 2 |
| 3 | pqr@mail.com | user 3 |
| 4 | abc@mail.com | user 4 |
+-----+---------------+----------+
问:我希望数据是在一封客户电子邮件下的订单,状态为待处理,而该客户在一周内没有付款状态订单
预期产出:一周内没有对应已付款订单的 1 个单笔订单
+------+-------------+----------------+-------------+
| id | customer_id | payment_status | created_on|
+------+-------------+----------------+-------------+
| 3 | 2 | unpaid | 2018-12-29 |
| 4 | 2 | unpaid | 2018-12-29 |
| 6 | 3 | unpaid | 2018-12-30 |
+------+-------------+----------------+-------------+
问:我想要数据,好像在一个客户电子邮件下有 2 个具有相同产品和相同数量的订单,具有待处理状态,而该客户在一周内没有支付状态订单
预期输出:2 两个订单,一周内没有相应的已付款订单
+------+-------------+----------------+-------------+
| id | customer_id | payment_status | created_on|
+------+-------------+----------------+-------------+
| 3 | 2 | unpaid | 2018-12-29 |
| 4 | 2 | unpaid | 2018-12-29 |
+------+-------------+----------------+-------------+
解决方案
第一个查询是可疑的——你真的是指email
orcustomer_id
吗?后者应该是您设计架构以将一个“客户”与另一个区分开来的方式。想通了。(并修复数据以使其清晰。)同时,我将假设customer_id
区分客户。
我无法理解第一个查询的目的。您正在寻找为较晚的订单付款但尚未为较早的订单付款的客户?或者在数据库中寻找错误的帖子?无论如何,这是一个镜头:
SELECT Unpd.id, Unpd.customer_id, Unpd.payment_status, Unpd.created_on
FROM Orders AS Pd ON Pd.customer_id = C.id
AND payment_status = 'paid'
WHERE NOT EXISTS
(
SELECT 1
FROM Orders AS Pd
WHERE Pd.customer_id = C.id
AND Pd.payment_status = 'paid'
AND Pd.created_on > NOW() - INTERVAL 1 WEEK
)
第二次查询。我将其改写为:在同一天找到同一客户的两个(或更多)订单(已付款或未付款)(但不检查商品是否相同):
SELECT O2.id, O2.customer_id, O2.payment_status, O2.created_on
FROM
(
SELECT O.customer_id, O.created_on
FROM Orders AS O
GROUP BY O.customer_id, O.created_on
HAVING COUNT(*) >= 2
) AS MultipleInOneDay
JOIN Orders AS O2 USING (customer_id, created_on)