mysql - sql 查询 : no payments in last 90 days

标签 mysql sql

假设我有一个有很多付款的客户。如何查询到最近90天内没有付款记录的所有客户?

clients
=======
id          integer
name        string

payments
========
id          integer
client_id   integer
created_at  datetime

本质上是相反的:

select *
from clients
inner join payments on payments.client_id = clients.id
where payments.created_at > utc_timestamp() - interval 90 day

希望比:

更有效率
select *
from clients 
where id not in (
  select *
  from clients
  inner join payments on payments.client_id = clients.id
  where payments.created_at > utc_timestamp() - interval 90 day
)

最佳答案

确保 payments(client_id) 上有一个索引,或者更好的是 payments(client_id, created_at)。

对于编写查询的替代方法,您可以尝试使用 not exists,例如:

select  *
from    clients c
where   not exists
        (
        select  *
        from    payments p
        where   p.payments.client_id = clients.id
                and payments.created_at > utc_timestamp() - interval 90 day
        )

或者独占左连接:

select  *
from    clients c
left join
        payments p
on      p.payments.client_id = clients.id
        and payments.created_at > utc_timestamp() - interval 90 day
where   p.client_id is null

如果两者都很慢,请将 explain extended 输出添加到您的问题中,以便我们了解原因。

关于mysql - sql 查询 : no payments in last 90 days,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5795541/

相关文章:

sql - 在 SQL 外连接中,查询的哪一部分将表放在 "left"或 "right"上?

mysql - 在数据库中查找包含特定字符串的记录

mysql - 使用 Ruby on Rails 和数据库时遇到的问题

mysql - mysql 表中具有最大值的 activerecord ruby​​ 行

mysql - 使用聚合函数的结果更新 mySQL 表

java - 在参数化查询中使用加号连接字符串

php - SQL INSERT 语句在不应该执行的时候执行

mysql - 需要确保无值列的计数就像 NULLS 和 COUNT(*)

mysql - 恢复 MySQL 数据库

sql - Postgres中基于聚合函数查询表ID