SQL-запрос: нет платежей за последние 90 дней - PullRequest
1 голос
/ 26 апреля 2011

Предположим, у меня есть клиент с большим количеством платежей.Как запросить, чтобы получить всех клиентов, у которых не было записей о платежах за последние 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
)

Ответы [ 2 ]

1 голос
/ 27 апреля 2011

Убедитесь, что есть индекс для 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 к своему вопросу, чтобы мы могли понять, почему.

0 голосов
/ 27 апреля 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...