Mysql 左加入最新纪录

Mysql 左加入最新纪录,mysql,Mysql,我看了几个似乎是解决办法的答案,但我很难把我的头绕在它周围 我下面的查询包含到jos\u payplans\u invoice和jos\u payplans\u事务的左连接。 我需要获取该发票的最新发票(b.invoice\u id)和最新交易(c.transaction\u id) 根据我的理解,我需要子查询,但不确定如何。 感谢您的帮助:-) 谢谢 SELECT a.subscription_id, b.invoice_id, c.transaction_id F

我看了几个似乎是解决办法的答案,但我很难把我的头绕在它周围

我下面的查询包含到
jos\u payplans\u invoice
jos\u payplans\u事务的左连接。
我需要获取该发票的最新发票(
b.invoice\u id
)和最新交易(
c.transaction\u 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_付费计划_订阅

jos_付款计划_发票

jos_付款计划_交易

这里可能有重构的机会(特别是如果您使用的是支持窗口功能的较新版本的mysql)。不过,这应该会让你大致了解:

为每个
发票\u 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
    )
获取每个
订单\u id
的最后一个
对象\u 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;

您可以尝试以下查询:

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

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

任何人都很难像现在这样帮助您。请记住,这里没有人熟悉您的数据模型(例如,您如何知道哪个记录是最新的?)。如果删除查询中与当前问题无关的部分,您将获得更好的响应,如果您包括一些有代表性的样本数据和您的预期结果。请参考此项。如果有人要求您仅获取您的
jos\u payplans\u transactions
表中每个发票id的最新交易id,而其他什么都没有,您将如何做?@Dyvel-请分享您的表结构,您在问题中提到的三个表的表列。这就足够解决您的问题了。@ishpret:我已经添加了我的表结构:-)谢谢您的解决方案。我正在运行MySQL 5.7-看起来它正在工作,但似乎几乎不可能运行-我的查询已经运行了一个小时了,但还没有完成:-OI猜一些索引可能会有所帮助。这些表上有索引吗?有关
创建日期
对象id
发票id
交易id
的索引应有助于加快速度。