我看了看似可以解决问题的几个答案,但是我很难把它包裹住。
我下面的查询包含对jos_payplans_invoice
和jos_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
答案 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
让我知道它是否对您有用。