2013-02-22 48 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