クリーンアップしようとしているクエリがあります。
私の元のクエリは次のとおりです。
SELECT h.userid, c.firstname, c.lastname, h.domain, h.nextduedate, h.domainstatus,
(SELECT COUNT(status)
FROM tblinvoices i, tblinvoiceitems ii
WHERE i.userid =h.userid
AND i.id = ii.invoiceid
AND i.STATUS LIKE 'Unpaid'
AND i.TOTAL = 80
AND ii.description LIKE 'Hosted Domain%')
AS invoice_count
FROM tblclients c, tblhosting h
WHERE h.userid=c.id AND c.status='Active'
AND c.id NOT IN (1,2,3,4,5)
AND h.domain LIKE '%thisdomain.com'
AND h.nextduedate<='2012-06-06'
ORDER BY h.domainstatus, h.nextduedate DESC
かなりうまく機能しますが、100% 正確ではありません。今日の日付よりも古い「nextduedate」を持つすべてのユーザーを取得していますが、nextduedate が NULL の未払いの請求書を持つユーザーがいます (アカウントはキャンセルされていますが、未払いの請求書がまだあります)。
このクエリでは 22 人のユーザーが得られますが、実行すると:
SELECT DISTINCT i.userid, COUNT(i.status)
FROM tblinvoices i, tblinvoiceitems ii
WHERE i.id = ii.invoiceid
AND i.STATUS LIKE 'Unpaid'
AND i.TOTAL = 80
AND ii.description LIKE 'Hosted Domain%')
次に、26 人のユーザー (および約 8 件の請求書の欠落) を取得します。
次の期日は実際には、どれだけ遅れているかを示すためのものです。このクエリの主な目的は、未払いの請求書を持つすべてのユーザーを表示することです。2 番目のクエリを最初のクエリといくつかの異なる方法で組み合わせようとしましたが、それがわかりません。サーバーがロックされたようです。
理想的には、私の戻り行は次のようになります。
userid, firstname, lastname, domain, domainstatus, "duedate" (これは理想的には最も古い請求書の日付です。簡単なので nextduedate を使用しています)、invoicecount (未払いの請求書の数)
参考までに、請求書の日付は i.invoicedate にあります
このクエリを最適化する方法を理解するのを助けていただければ幸いです!