0

クリーンアップしようとしているクエリがあります。

私の元のクエリは次のとおりです。

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 にあります

このクエリを最適化する方法を理解するのを助けていただければ幸いです!

4

1 に答える 1

1

あなたはと交換しようとするかもしれませDISTINCTGROUP BY

SELECT h.userid, c.firstname, c.lastname, h.domain, h.nextduedate, h.domainstatus, count(i.status) AS invoice_count

FROM tblclients c, tblhosting h 
LEFT JOIN tblinvoices i ON i.userid =h.userid         
    AND i.STATUS LIKE  'Unpaid'
    AND i.TOTAL = 80
LEFT JOIN tblinvoiceitems ii ON i.id = ii.invoiceid
    AND ii.description LIKE  'Hosted Domain%'


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'
GROUP BY h.userid 
ORDER BY h.domainstatus, h.nextduedate DESC
于 2012-06-06T07:38:17.887 に答える