SQL查询:最近90天内没有付款



假设我有一个有许多付款的客户端。我如何查询获得在过去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输出添加到您的问题中,这样我们就可以看到原因了。

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

最新更新