左加入最新记录

时间:2020-03-17 12:35:41

标签: mysql

我看了看似可以解决问题的几个答案,但是我很难把它包裹住。

我下面的查询包含对jos_payplans_invoicejos_payplans_transaction的左联接。 我需要获取该发票的最新发票(b.invoice_id)和最新交易(c.transaction_id)。

据我了解,我需要子查询,但不确定如何执行。 任何帮助表示赞赏:-)

谢谢

SELECT 
    a.subscription_id,
    b.invoice_id,
    c.transaction_id 
FROM jos_payplans_subscription AS a 
LEFT JOIN jos_payplans_invoice AS b ON b.object_id = a.order_id 
LEFT JOIN jos_payplans_transaction AS c ON c.invoice_id = b.invoice_id 
GROUP BY a.subscription_id
ORDER BY c.transaction_id DESC

注意: jos_payplans_invoice.object_id = jos_payplans_subscription.order_id

jos_payplans_subscription jos_payplans_subscription

jos_payplans_invoice jos_payplans_invoice

jos_payplans_transaction enter image description here

2 个答案:

答案 0 :(得分:1)

这里可能会有一些重构的机会(特别是如果您使用的是支持窗口功能的较新版本的mysql)。不过,这应该可以使您进入球场:

获取每个transaction_id的最后一个invoice_id

SELECT transaction_id, invoice_id 
FROM jos_payplans_transactions jpt
WHERE create_date = 
    (
        SELECT max(create_date)
        FROM jos_payplans_transactions
        WHERE jpt.invoice_id = invoice_id
    )

获取每个object_id的最后一个order_id

SELECT invoice_id, object_id
FROM jos_payplans_invoice jpi
WHERE create_date = 
    (
        SELECT max(create_date)
        FROM jos_payplans_invoice
        WHERE jpi.object_id = object_id
    )

将它们放在一起:

SELECT
    a.subscription_id,
    b.invoice_id,
    c.transaction_id
FROM jos_payplans_subscription as a
    LEFT OUTER JOIN 
        (
            SELECT invoice_id, object_id
            FROM jos_payplans_invoice jpi
            WHERE create_date = 
                (
                    SELECT max(create_date)
                    FROM jos_payplans_invoice
                    WHERE jpi.object_id = object_id
                )
        ) b on a.order_id = b.object_id
    LEFT OUTER JOIN 
        (
            SELECT transaction_id, invoice_id 
            FROM jos_payplans_transactions jpt
            WHERE create_date = 
                (
                    SELECT max(create_date)
                    FROM jos_payplans_transactions
                    WHERE jpt.invoice_id = invoice_id
                )
        ) c on b.invoice_id = c.invoice_id;

较新版本的Mysql(8.0+)可以处理窗口功能,这将有助于提高性能,因为只需要对每个表进行一次扫描:

SELECT
    a.subscription_id,
    b.invoice_id,
    c.transaction_id
FROM jos_payplans_subscription as a
    LEFT OUTER JOIN 
        (
            SELECT invoice_id, 
                object_id, 
                ROW_NUMBER() OVER (PARTITION BY object_id ORDER BY create_date) as rn
            FROM jos_payplans_invoice jpi               
        ) b on a.order_id = b.object_id
            AND b.rn = 1
    LEFT OUTER JOIN 
        (
            SELECT transaction_id, 
                invoice_id ,
                ROW_NUMBER() OVER (PARTITION BY invoice_id ORDER BY create_date) as rn
            FROM jos_payplans_transactions jpt              
        ) c on b.invoice_id = c.invoice_id
            AND c.rn = 1;

答案 1 :(得分:0)

您可以尝试以下查询:

SELECT 
    a.subscription_id,
    b.invoice_id,
    c.transaction_id 
FROM jos_payplans_subscription AS a 
LEFT JOIN jos_payplans_invoice AS b ON b.invoice_id = (SELECT max(invoice_id) FROM jos_payplans_invoice WHERE object_id=a.order_id)
LEFT JOIN jos_payplans_transaction AS c ON c.transaction_id = (SELECT max(transaction_id) FROM jos_payplans_transaction WHERE invoice_id = b.invoice_id) 
GROUP BY a.subscription_id
ORDER BY c.transaction_id DESC

让我知道它是否对您有用。

相关问题