来自 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 通过两个条件进行比较:

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 进行左连接并应用我们的条件。