Я хотел использовать 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;
Пример структуры таблицы:
Билет
примечание
Я нашел открытый билет jira от людей, которые просили mariadb поддержать lateral.
Из того, что я прочитал, 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 работать, где-то выдавая мне синтаксическую ошибку. Но ваш более поздний пример работает. Будет ли разница в производительности между ними?
Извините, у меня была опечатка в первом запросе, которая исправлена. Вероятно, вам следует использовать первый запрос.
Спасибо. Я заметил отсутствующую скобку сразу после того, как написал.
Для интересующихся билетами на это: jira.mariadb.org/browse/MDEV-19078 и jira.mariadb.org/browse/MDEV-6373