2011-04-26 95 views
1

假設我有一個有很多付款的客戶。如何查詢以獲得在過去90天內沒有付款記錄的所有客戶?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 
) 
+2

您使用的數據庫是? – Oded 2011-04-26 19:41:40

+0

最後一個查詢運行緩慢還是什麼? – 2011-04-26 19:41:57

+0

你使用什麼SQL語言? – FrustratedWithFormsDesigner 2011-04-26 19:42:00

回答

1

確保有一個指數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

謝謝,獨家左連接似乎是要走的路。 – jemminger 2011-04-26 21:29:52

0
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 
相關問題