Mariadb альтернатива внешнему или боковому применению?

Я хотел использовать CROSS APPLY, но я думаю, что этого не существует в mysql. Альтернатива, которую я читал, - LATERAL. Ну, я использую mariadb 10.3, и я думаю, что его тоже не существует. Таблица тикетов содержит идентификатор, на который ссылается столбец ticket_id в таблице заметок. В билете может быть много заметок, я пытаюсь перечислить все билеты с датой последней записи (post_date). Как я могу написать запрос ниже для mariadb?

SELECT t.*, n.post_date
FROM ticket t,
LATERAL (
    SELECT note.post_date FROM note WHERE t.id = note.ticket_id ORDER BY note.post_date DESC LIMIT 1
) n;

Пример структуры таблицы:

Билет

идентификатор предмет 1 вещи 2 более

примечание

идентификатор Дата публикации ticket_id 1 1 2 1 3 2 4 1 5 2

Я нашел открытый билет jira от людей, которые просили mariadb поддержать lateral.

Для интересующихся билетами на это: jira.mariadb.org/browse/MDEV-19078 и jira.mariadb.org/browse/MDEV-6373

Jens Schauder 14.04.2023 13:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
249
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из того, что я прочитал, LATERAL не будет поддерживаться в MariaDB до версии 11. Но мы можем так же легко использовать ROW_NUMBER здесь, которая поддерживается:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY ticket_id ORDER BY post_date DESC) rn
    FROM note
)

SELECT t.*, n.post_date
FROM ticket t
INNER JOIN cte n
    ON n.ticket_id = t.id
WHERE n.rn = 1;

Если вам нужен близкий перевод вашего текущего бокового соединения, используйте:

SELECT t.*,
    (SELECT n.post_date
     FROM note n
     WHERE t.id = note.ticket_id
     ORDER BY n.post_date DESC
     LIMIT 1)
FROM ticket t;

Я не мог заставить ваш пример WITH работать, где-то выдавая мне синтаксическую ошибку. Но ваш более поздний пример работает. Будет ли разница в производительности между ними?

Phaelax z 26.11.2022 07:20

Извините, у меня была опечатка в первом запросе, которая исправлена. Вероятно, вам следует использовать первый запрос.

Tim Biegeleisen 26.11.2022 07:21

Спасибо. Я заметил отсутствующую скобку сразу после того, как написал.

Phaelax z 26.11.2022 07:22

Другие вопросы по теме