[英]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
我有兩張表,一張存儲客戶通過在我們電子商務網站的前端添加產品創建的購物車,另一張表(訂單)在客戶完成結帳后填充。
一些用戶已經放棄了購物車,所以我想通過兩個條件檢查購物車表並將其與訂單表進行比較:
餐桌推車
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
表訂單
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
表中每個唯一user_id
與該user_id
的最大created_on
日期(別名為last_order_date
)的關系。 具有別名sq2
的子查詢將前一個查詢與orders
表進行內部連接,以便我們還可以獲得與每個user_id
的最大created_on
行關聯的order_id
列。 最后,我們將carts
表與sq2
表進行左連接並應用我們的條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.