来自 table A 的 Select 行,其中 ID 在 table B 上不存在,或者如果存在,select 仅当超过 3 个月时
Select rows from table A where ID doesn't exists on table B or if exists, select only if is more than 3 months old
我有两个 table,一个存储客户通过在我们电子商务网站的前端添加产品而创建的购物车,另一个 table(订单)在客户完成结帐。
一些用户放弃了购物车,所以我想检查购物车 table 将其与订单 table 通过两个条件进行比较:
- 如果用户有购物车条目但没有自己的订单条目,则 select 该购物车
- 如果用户有一个购物车条目和一些订单条目,但用户在过去三个月内没有订单,并且购物车比三个月新,那么select那个购物车
Table 购物车
cart_id user_id modified_on
5477 1125 2022-01-04 15:31:31
5476 2998 2022-01-04 14:34:31
5474 1305 2022-01-03 21:52:57
5473 986 2022-01-03 13:13:12
5471 3040 2022-01-03 01:32:28
Table 订单
order_id user_id created_on
44 927 2018-11-23 00:26:43
46 932 2018-11-26 14:36:28
47 945 2018-11-26 15:35:34
48 948 2018-11-27 21:33:37
53 945 2018-12-02 18:20:55
到目前为止,我已经有了这个查询坚果,我知道它是错误的
SELECT DISTINCT
`vmc`.`user_id`,
`vmo`.`order_id`,
`vmc`.`created_on` AS `Order Created On`,
`vmc`.`modified_on` AS `Cart Last Modified`,
FROM `carts` `vmc`
LEFT JOIN `orders` `vmo`
ON `vmc`.`user_id` = `vmo`.`user_id`
WHERE `vmo`.`order_id` IS NULL
OR (`vmo`.`created_on` <= NOW() - INTERVAL 3 MONTH AND `vmc`.`cart_id` <> NULL)
ORDER BY `vmc`.`modified_on` DESC
下面的查询应该给你你想要的:
SELECT
`carts`.`user_id`,
`sq2`.`order_id`,
`sq2`.`last_order_date` AS `Last Order Date`,
`carts`.`cart_id`,
`carts`.`modified_on` AS `Cart Last Modified`
FROM `carts`
LEFT JOIN (
SELECT `user_id`, `order_id`, `sq1`.`last_order_date`
FROM `orders` INNER JOIN (
SELECT `user_id`, MAX(`created_on`) as `last_order_date`
FROM `orders`
GROUP BY `order_id`
) `sq1` ON `orders`.`user_id` = `sq1`.`user_id`
) `sq2` ON `carts`.`user_id` = `sq2`.`user_id`
WHERE `sq2`.`order_id` IS NULL OR `sq2`.`last_order_date` <= NOW() - INTERVAL 3 MONTH
ORDER BY `carts`.`modified_on` DESC
带有别名 sq1
的子查询生成 orders
table 中每个唯一 user_id
与最大 created_on
日期的关系(别名为 last_order_date
) 对于 user_id
。带有别名 sq2
的子查询对前一个查询与 orders
table 进行内部连接,这样我们也可以获得与最大值 [=14= 关联的 order_id
列] 行对应每个 user_id
。最后,我们将 carts
table 与 sq2
table 进行左连接并应用我们的条件。
我有两个 table,一个存储客户通过在我们电子商务网站的前端添加产品而创建的购物车,另一个 table(订单)在客户完成结帐。
一些用户放弃了购物车,所以我想检查购物车 table 将其与订单 table 通过两个条件进行比较:
- 如果用户有购物车条目但没有自己的订单条目,则 select 该购物车
- 如果用户有一个购物车条目和一些订单条目,但用户在过去三个月内没有订单,并且购物车比三个月新,那么select那个购物车
Table 购物车
cart_id user_id modified_on
5477 1125 2022-01-04 15:31:31
5476 2998 2022-01-04 14:34:31
5474 1305 2022-01-03 21:52:57
5473 986 2022-01-03 13:13:12
5471 3040 2022-01-03 01:32:28
Table 订单
order_id user_id created_on
44 927 2018-11-23 00:26:43
46 932 2018-11-26 14:36:28
47 945 2018-11-26 15:35:34
48 948 2018-11-27 21:33:37
53 945 2018-12-02 18:20:55
到目前为止,我已经有了这个查询坚果,我知道它是错误的
SELECT DISTINCT
`vmc`.`user_id`,
`vmo`.`order_id`,
`vmc`.`created_on` AS `Order Created On`,
`vmc`.`modified_on` AS `Cart Last Modified`,
FROM `carts` `vmc`
LEFT JOIN `orders` `vmo`
ON `vmc`.`user_id` = `vmo`.`user_id`
WHERE `vmo`.`order_id` IS NULL
OR (`vmo`.`created_on` <= NOW() - INTERVAL 3 MONTH AND `vmc`.`cart_id` <> NULL)
ORDER BY `vmc`.`modified_on` DESC
下面的查询应该给你你想要的:
SELECT
`carts`.`user_id`,
`sq2`.`order_id`,
`sq2`.`last_order_date` AS `Last Order Date`,
`carts`.`cart_id`,
`carts`.`modified_on` AS `Cart Last Modified`
FROM `carts`
LEFT JOIN (
SELECT `user_id`, `order_id`, `sq1`.`last_order_date`
FROM `orders` INNER JOIN (
SELECT `user_id`, MAX(`created_on`) as `last_order_date`
FROM `orders`
GROUP BY `order_id`
) `sq1` ON `orders`.`user_id` = `sq1`.`user_id`
) `sq2` ON `carts`.`user_id` = `sq2`.`user_id`
WHERE `sq2`.`order_id` IS NULL OR `sq2`.`last_order_date` <= NOW() - INTERVAL 3 MONTH
ORDER BY `carts`.`modified_on` DESC
带有别名 sq1
的子查询生成 orders
table 中每个唯一 user_id
与最大 created_on
日期的关系(别名为 last_order_date
) 对于 user_id
。带有别名 sq2
的子查询对前一个查询与 orders
table 进行内部连接,这样我们也可以获得与最大值 [=14= 关联的 order_id
列] 行对应每个 user_id
。最后,我们将 carts
table 与 sq2
table 进行左连接并应用我们的条件。