Как создать условную функцию MySQL, которая выполняет итерацию по таблице и принимает несколько параметров

Я очень новичок в PL / SQL, но я хотел бы заполнить пустое поле для всех записей в таблице на основе значений нескольких полей в заданной строке. Итак, логика, которую я хотел бы изложить, такова, но есть несколько вещей, о которых мне нужно помнить при настройке стола для автосалона ...

Сначала сгруппируйте по отдельным used_car_ids, затем обновите столбец на основе .....

  1. Если столбец used_car_id равен new_car_id, а параметры drive_mode и saftey_rating равны 1, тогда установите для параметра Parking_Spot значение 1 как наивысший приоритет.
  2. Если столбец used_car_id равен new_car_id, но drive_mode равно 1, а saftey_rating равно 2, тогда установите для столбца Parking_Spot значение 2 или доступный последовательный номер Parking_Spot.

    • Если есть другие условия, похожие на это, но отличается только saftey_rating, я хотел бы продолжать увеличивать число Parking_Spot до следующего доступного последовательного номера Parking_spot для этой записи
  3. Если столбец used_car_id равен new_car_id, но drive_mode равно 2, а saftey_rating равно 1, тогда установите для столбца Parking_Spot значение 3 или следующий доступный номер Parking_Spot.

  4. Если столбец used_car_id равен new_car_id, но drive_mode равно 2, а saftey_rating равно 2, тогда установите номер Parking_Spot на 4 или следующий доступный номер Parking_Spot.
    • Применяются те же правила, что и выше.

Если случай с наивысшим приоритетом не выполняется, он должен рассматривать 2 варианта использования как наивысший и помещать его как Parking_Spot = 1.

Это небольшая картинка того, что я хотел бы в идеале. Итак, как вы можете видеть на картинке, номер парковочного места равен 1 и 2, в зависимости от того, равны ли used_car_id, new_car_id, drive_mode и safety_rating 1 и 2, но как только used_car_id и new_car_id отличаются, количество парковочных мест увеличивается до 3 и 4. .

Как создать условную функцию MySQL, которая выполняет итерацию по таблице и принимает несколько параметров

Я предполагаю, что мне нужна функция для ввода 4 параметров, и на основе этих полей я возвращаю число как место для парковки. Но я все еще не уверен, как это сделать. Любая помощь будет оценена по достоинству. Спасибо.

PL / SQL - это язык процедурной части базы данных Oracle, но у вас есть теги mysql. Что вы на самом деле используете?

Allan 27.04.2018 21:00

Пометьте правильно !!!! Если это Oracle, почему я вижу тег MySQL в вашем вопросе ???

Eric 28.04.2018 00:43

Извините, пожалуйста, потерпите меня. Я не знал, что PL / SQL предназначен только для Oracle. Это база данных MySQL. Я только что отредактировал название вопроса и теги. Спасибо всем за то, что указали на это.

user3116769 28.04.2018 00:48
Освоение архитектуры микросервисов с 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
3
53
1

Ответы 1

Из ваших тегов неясно, используете ли вы базу данных Oracle или MySQL. Этот ответ предполагает первое.

В вашем вопросе есть пара пробелов, но похоже, что вы хотите дать каждой строке последовательный номер на основе drive_mode и safety_rating. Вы упоминаете "used_car_id column is equal to the new_car_id" несколько раз, но никогда не упоминаете, что вы хотите сделать, когда они не равны.

Что касается написанного вопроса, кажется, что его можно решить довольно просто с помощью аналитических функций. В этом случае мы просто скажем функции упорядочить строки по drive_mode_id и safety_rating и присвоить каждой строке из результирующего порядка порядковый номер:

SELECT id,
       used_car_id,
       new_car_id,
       car_features_id,
       drive_mode_id,
       safety_rating,
       ROW_NUMBER () OVER (ORDER BY drive_mode, safety_rating)
           AS parking_spot
FROM   your_table
WHERE  used_car_id = new_car_id

Похоже, что MySQL поддерживает аналитические функции (также известные как оконные функции) начиная с версии 8.0.2, поэтому указанное выше решение должно работать, если вы используете эту версию или более позднюю (в противном случае может помочь этот ответ).

Чтобы обновить это, чтобы также рассматривать used_car_id = new_car_id как условие сортировки, вам нужно добавить условие в ORDER BY:

SELECT id,
       used_car_id,
       new_car_id,
       car_features_id,
       drive_mode_id,
       safety_rating,
       ROW_NUMBER ()
       OVER (
           ORDER BY
               CASE WHEN used_car_id = new_car_id THEN 1 ELSE 2 END,
               drive_mode,
               safety_rating)
           AS parking_spot
FROM   your_table

Это не проверено, поэтому я не могу гарантировать, что это полностью синтаксически правильно, но это должно быть близко.

Спасибо за ответ, Аллан, я использую базу данных Mysql. Мне очень жаль, что я хотел затронуть еще один вопрос. Если used_car_id и new_car_id не равны, то их следует рассматривать как более низкий приоритет по сравнению с теми, которые равны. Итак, если есть строка с

user3116769 27.04.2018 21:31

Спасибо за ответ, Аллан, я использую базу данных Mysql. Мне жаль, что я хотел упомянуть об этом. Но если used_car_id и new_car_id не равны, тогда их следует рассматривать как более низкий приоритет по сравнению с теми, которые равны. Итак, если есть строка, в которой и used_car_id, и new_car_id равны, несмотря на значения других столбцов, и она должна иметь меньшее значение Parking_Spot, чем те, которые не равны. Я думал, что мне нужно заказать по Parking_Spots и groupBy по drive_mode. Но мне нравится этот подход, за исключением того, что он не может быть скомпилирован в Workbench, вы можете мне помочь?

user3116769 27.04.2018 21:42

Есть ли версия Mysql для этого запроса, поскольку в Mysql нет таких функций, как ROW_NUMBER или OVER, которые вызывают ошибки.

user3116769 27.04.2018 21:48

Я связался с другим вопросом, касающимся эмуляции этой функции в ответе.

Allan 27.04.2018 21:50

Таким образом, используется версия Mysql 5.7, так что эта версия должна была быть выпущена несколько месяцев назад. Так что, если бы мне пришлось придерживаться синтаксиса MySQL 5.7. Есть ли способ воспроизвести эту функцию, или мне придется вместо этого использовать pl / sql в моей ситуации?

user3116769 27.04.2018 22:58

@ user3116769 Разве это не бесполезно, если вы не помечаете правильно ??? Поскольку вы указываете PL/SQL в своем названии, люди предполагают, что вы используете Oracle. Теперь кто-то дает вам решение для Oracle, и вы не можете его использовать. Вы просто зря тратите время !!!

Eric 28.04.2018 00:48

@Eric: Мои извинения, я использую сервер MySQL 5.7, и я не знал, что PL / SQL является эксклюзивным только для OracleSQL. Для меня это немного в новинку. Пожалуйста, поймите.

user3116769 28.04.2018 00:52

Кроме того, как я уже упоминал выше, в ответ я включил ссылку на вопрос о репликации функции row_number в MySQL. И снова: stackoverflow.com/questions/1895110/row-number-in-mysql

Allan 30.04.2018 15:47

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