Как следует из названия, MySQL Workbench сообщает об ошибке. Насколько я могу судить, ошибка связана с программным обеспечением, а не с MySQL. Однако это не позволяет мне исправлять ошибки в коде, так как он не будет работать на моем веб-сайте.
Первоначально я использовал этот запрос, который отлично работает, но очень медленный, так как он имеет выборку внутри внутреннего соединения.
SELECT *
FROM modeller AS m
INNER JOIN
bilder AS b ON b.ID = (
SELECT ID FROM bilder AS b2
WHERE b2.modellID = m.id
ORDER BY filnavn
DESC LIMIT 1
)
order by m.fornavn
Итак, я искал замену и остановился на этом:
SELECT *
FROM (
SELECT p.*,
m.*,
row_number() over (partition by m.id order by filnavn desc) rono
FROM modeller AS m
INNER JOIN bilder AS B
on B.modellID= m.ID
) x
WHERE x.rono = 1
Что этот запрос должен делать, так это просматривать базу данных 3D-моделей («модельер») и получать последнее изображение, добавленное к этой модели в таблице «билдер». Это соединение «один ко многим», в билдере есть столбец modellID, который соответствует идентификатору в моделлере.
Вместо этого я получаю ошибку
SELECT is not valid at this position for this server version, expecting : '(', WIDTH
Приветствуются любые советы, подсказки или предложения, особенно то, что не только позволяет обойти ошибку Workbench, но и улучшает мой первоначальный запрос.
@isaace MySQL 5.7, но ошибка исходит от MySQL Workbench (последняя версия)
оконные функции будут работать только с mysql 8.0, поэтому row_number()
не будет работать.
Ах хорошо. Ну, я думаю, мне просто придется использовать более медленный тогда. Спасибо!
Альтернативой, которую вы можете попробовать, является:
SELECT *
FROM modeller AS m
INNER JOIN (
SELECT model1ID, MAX(filnavn) AS filnavnMax
FROM bilder
GROUP BY model1ID
) AS maxVals
ON m.id = maxVals.model1ID
INNER JOIN bilder AS b
ON maxVals.model1ID = b.model1ID AND maxVals.filnavnMax = b.filnavn
ORDER BY m.fornavn
;
Однако, если filnavn не уникален для model1ID, вы можете получить больше результатов, чем вернул исходный запрос. Но если это так, ваш исходный запрос может дать противоречивые результаты (поскольку нет гарантии, что идентификатор, возвращаемый из исходного подзапроса, будет согласованным, когда имеется более одной строки с самым высоким filnavn).
Этот метод увеличил мой запрос с 7,125 секунды до 0,031. Я бы сказал, что это улучшение! :D Большое спасибо @Uueerdo :-)
@praxiz Я бы частично приписал это тому факту, что ваш исходный запрос имел коррелированный подзапрос (подзапрос, который ссылается на внешний запрос). Такие подзапросы выполняются (внутренне) повторно для каждого кандидата из внешнего запроса. Они могу будут быстрее при определенных обстоятельствах, например, когда кандидаты внешнего запроса уже значительно сужены (сведение к минимуму времени выполнения подзапроса) и/или некоррелированная версия подзапроса относительно дорогая. (например: найти максимальные значения filnavn для миллионов идентификаторов model1, когда это необходимо только для нескольких идентификаторов model1).
какая версия майскл?