#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 на голосование. Если мой ответ действительно поможет вам, пожалуйста, отметьте его как принятый вместе с голосованием.