Как объединить два связанных соединения в одно?

#mysql #sql #join

Вопрос:

У меня есть такой вопрос:

 select * from wallet w
join where_to_pay wtp on wtp.wallet_id = w.id
join (select wallet_id w_id, max(business_id) from where_to_pay group by wallet_id) on w_id = w.id
 

Как вы можете видеть, между wallet таблицами и есть два соединения where_to_pay . Единственное отличие заключается в том, что во втором соединении строки группируются по wallet_id (что возвращает уникальный business_id ).

Поскольку эти два соединения похожи, я хочу знать, можно ли удалить одно из них и вместо этого использовать функцию окна (например, row_number или first_row или что необходимо)?

Комментарии:

1. Хотя существуют альтернативные методы, использующие оконные функции, очень вероятно, что у вас уже есть более эффективный вариант, если вы используете mysql 8 , вы можете рассмотреть возможность бокового соединения.

Ответ №1:

Если необходимы два столбца таблиц, используйте подзапрос, в котором ROW_NUMBER() используется для сериализации информации wallet_id в порядке убывания business_id. Затем ПРИСОЕДИНЯЙТЕСЬ к основной таблице.

 SELECT * 
FROM wallet w
INNER JOIN (SELECT *
                 , ROW_NUMBER() OVER (PARTITION BY wallet_id ORDER BY business_id DESC) row_num
            FROM where_to_pay) t
        ON w_id = t.wallet_id
       AND t.row_num = 1;
 

Комментарии:

1. Я понимаю.. Я проверю это,, спасибо, озвучу

2. Добро пожаловать @MartinAJ на голосование. Если мой ответ действительно поможет вам, пожалуйста, отметьте его как принятый вместе с голосованием.