LEFT JOIN с последней записью - PullRequest
0 голосов
/ 17 марта 2020

Я посмотрел на несколько ответов, которые кажутся решением, но мне трудно обдумать это.

Мой запрос ниже содержит левое соединение с 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

jos_payplans_subscription jos_payplans_subscription*1018*

jos_payplans_invoice jos_payplans_invoice

jos_payplans_transaction enter image description here

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Здесь может быть некоторая возможность для рефакторинга (особенно если вы используете более новую версию 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;
0 голосов
/ 18 марта 2020

Вы можете попробовать следующий запрос:

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

Дайте мне знать, работает ли он для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...