MySQL Workbench, как исправить ошибку «SELECT недействителен в этой позиции для этой версии сервера»

Как следует из названия, 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 09.04.2019 20:27

@isaace MySQL 5.7, но ошибка исходит от MySQL Workbench (последняя версия)

praxiz 09.04.2019 20:32

оконные функции будут работать только с mysql 8.0, поэтому row_number() не будет работать.

isaace 09.04.2019 20:34

Ах хорошо. Ну, я думаю, мне просто придется использовать более медленный тогда. Спасибо!

praxiz 09.04.2019 20:37
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
4
5 589
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Альтернативой, которую вы можете попробовать, является:

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 10.04.2019 06:13

@praxiz Я бы частично приписал это тому факту, что ваш исходный запрос имел коррелированный подзапрос (подзапрос, который ссылается на внешний запрос). Такие подзапросы выполняются (внутренне) повторно для каждого кандидата из внешнего запроса. Они могу будут быстрее при определенных обстоятельствах, например, когда кандидаты внешнего запроса уже значительно сужены (сведение к минимуму времени выполнения подзапроса) и/или некоррелированная версия подзапроса относительно дорогая. (например: найти максимальные значения filnavn для миллионов идентификаторов model1, когда это необходимо только для нескольких идентификаторов model1).

Uueerdo 10.04.2019 18:10

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