2013-02-22 47 views
0

我遇到以下問題。我有3張桌子,1張發票,1張發票記錄和1張發票付款記錄。通過多個左連接的日期排序

發票只能在發送發票時支付。每筆付款或發送都有一個基於列invoice_id的關係。

所以我想要的是一個列表限制在5個發票上的最新行動(發送或付款)排序。因此,如果最後一次發票(基於date_time)發票較新,那麼最後一次付款(基於date_time)發票必須位於列表的頂部,反之亦然。

有沒有人有一個想法如何實現這一目標?

回答

1

嘗試這樣:

SELECT (SELECT MAX(DATE) 
      FROM (SELECT DATE 
        FROM PAYMENTS P 
        WHERE P.INVOICE_ID = IN.INVOICE_ID 
        UNION 
        SELECT DATE 
        FROM SENDS S 
        WHERE S.INVOICE_ID = IN.INVOICE_ID) SUB) MAX_DATE, 
     IN.* 
    FROM INVOICE IN 
ORDER BY 1 DESC 
LIMIT 5 

更新:

的SQL上述方法無效,因爲該表發票不能分選第二級別內進行訪問。

試試這個選擇:

SELECT V.* 
    FROM verkoopfacturen AS V 
    LEFT JOIN (SELECT invoice_id, 
        MAX(datum) as max_date 
       FROM (SELECT P.invoice_id, 
          P.date AS datum 
         FROM invoice_payments AS P 
         UNION 
         SELECT S.file_id, 
          S.datum AS datum 
         FROM email AS S) SUB 
       GROUP BY SUB.invoice_id) SUB2 on V.Verkoopfact_InfId = SUB2.invoice_id 
    ORDER BY SUB2.MAX_DATE DESC 
    LIMIT 5 
+0

thanx您的答案,但我不能使它發揮作用。首先我得到一個錯誤:每個派生表都必須有自己的別名 – 2013-02-22 11:15:45

+0

嘗試將別名添加到第一列的第一個子查詢中,我更新了將'SUB'作爲別名的答案。 – 2013-02-22 11:21:06

+0

我嘗試這樣做:SELECT ( \t SELECT MAX(基準面) FROM ( \t SELECT P.date AS基準 FROM invoice_payments爲P WHERE P.invoice_id = V.Verkoopfact_InfId UNION SELECT S.datum爲基準 從電子郵件爲S WHERE S.file_id = V.Verkoopfact_InfId \t) SUB ) MAX_DATE,五* FROM verkoopfacturen爲V ORDER BY 1 DESC LIMIT 5但是,我收到一個錯誤:'where子句'中的未知列'V.Verkoopfact_InfId'奇怪,因爲我確信列存在。 – 2013-02-22 11:55:15