当前位置: 首页 > 知识库问答 >
问题:

从表A中选择ID在表B中不存在的行,或者如果存在,则仅选择超过3个月的行

仉昂熙
2023-03-14

我有两个表,一个存储客户通过在我们的电子商务网站前端添加产品创建的推车,另一个表(订单)是在客户完成结账后填充的。

一些用户已经放弃了carts,因此我想检查carts表,并通过两个条件将其与orders表进行比较:

  • 如果用户有购物车条目,但自己没有订单条目,则选择该购物车

台式推车

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

共有1个答案

郑和泰
2023-03-14

以下查询应为您提供所需内容:

sql prettyprint-override">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\u id与该用户id日期创建的最大(别名为last\u order\u date)的关系。别名为sq2的子查询将上一个查询与orders表进行内部联接,这样我们还可以获得与每个用户id行上创建的最大相关联的订单id列。最后,我们将carts表与sq2表进行左连接,并应用我们的条件。

 类似资料:
  • 问题内容: 我有一个关于ORACLE的问题,我写了一个PLSQL CODE来检查一个表是否存在,如果存在,那么我从该表中选择一些东西。 如果(表存在)从表中选择…。 问题是,即使表条件不存在且select语句从不执行,即使表不存在,我也总是会收到错误消息。 我认为这是因为在编译时检查了我的代码:“ select from ..”,如果表不存在,则会打印错误。我该如何解决这样的问题?..这是我的代码

  • 问题内容: 我有两个postgresql表: 我想获取其中没有一行的每个IP地址。 我尝试了此查询,但它引发了语法错误。 我也想知道此查询(进行调整以使其工作)是否是为此目的性能最佳的查询。 问题答案: 基本上有4种技术可以完成此任务,所有这些技术都是标准SQL。 在Postgres中通常最快。 [](https://www.postgresql.org/docs/current/queries-

  • 我有两个postgresql表: 我想从登录日志中获取每个IP地址,它在IP\U位置中没有一行 我尝试了此查询,但它引发了语法错误。 我还想知道这个查询(通过调整使其工作)是否是用于此目的的性能最好的查询。

  • 问题内容: 可以说我在mysql中有这两个表。 表格1: 表2: 然后,我有此查询以获取每个月的员工分析: 该查询将输出: 但是,如果我从查询中替换“ 2016-04-01”和“ 2016-07-31”之间的日期,则不会向我显示7月记录,因为它在表1中不存在,这不是我想要的。我仍然想得到这样的结果: 有人对此吗?请帮助我。谢谢! 问题答案: 考虑以下模式,其中第三个表是提到的年/月帮助程序表。He

  • 问题内容: 我有2张桌子,一张用于会员,另一张用于他们的服务。这些是MySQL 5.6服务器上的InnoDB表。 会员表: 服务表: 我尝试达到以下结果: 因此,如果服务表中存在用户ID,则列服务将为true或false。 我尝试使用JOIN和子查询来完成此操作,但没有成功,因此我需要您的帮助;) 问题答案: 使用服务表,请尝试此查询

  • 问题内容: 我得到了一个带有自动公司常规设置的桌子。ID。一些行已被删除,因此ID列表可能如下所示: (1,2,3,5,8,…) 然后,从另一个来源( 编辑:另一个来源=数据库中不存在 ),我得到了这个数组: (1、3、4、5、7、8) 我正在寻找我可以在数据库上使用的查询,以从我拥有的数组中获取表中未包含的ID:s的列表。可能是: (4、7) 是否存在?我现在的解决方案是创建一个临时表,以便命令