powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Обновление записей таблицы по сложному условию
8 сообщений из 8, страница 1 из 1
Обновление записей таблицы по сложному условию
    #39667712
ndashutin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день

Есть задача обновить некий признак сущности sku который отвечает за основную запись в случае возникновения дублей с размерами.
Есть таблица sku c полями:
id

product_id

is_active

sale_price

is_main_auto

size_code

is_active

Есть таблица с sku_store - связка магазинов с sku

store_id

quantity

sku_id

Есть таблица store

id

active

Написал запрос, который (в теории) должен пробежаться по всем записям таблицы и проставить признак is_main_auto в 0 или 1 в зависимости от результата условия

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
INSERT INTO
  sku (id, product_id, is_active, sale_price, is_main_auto, size_code)
  SELECT
    id,
    product_id,
    is_active,
    sale_price,
    is_main_auto,
    size_code
  FROM sku
ON DUPLICATE KEY
UPDATE
  is_main_auto = (SELECT EXISTS(
      SELECT *
      FROM sku
      WHERE
        id = VALUES(id)
         /* тут я определяю что нет такого же sku с таким же размером, у которого уже есть признак is_main_auto === true  */
        AND !(SELECT EXISTS(SELECT *
                            FROM sku
                            WHERE
                              is_main_auto = true
                              AND id != VALUES(id)
                              AND product_id = VALUES(product_id)
                              AND size_code = VALUES(size_code))
        )
         /* Тут я определяю что текущая запись активна  */
        AND (SELECT EXISTS(SELECT *
                           FROM sku
                           WHERE
                             is_active = 1
                             AND product_id = VALUES(product_id))
        )
         /*  Тут я определяю что текущая запись имеет стоимость больше нуля */
        AND (SELECT EXISTS(SELECT *
                           FROM sku
                           WHERE sale_price > 0 AND product_id = VALUES(product_id))
        )
       /*  Тут я определяю что есть хоть один активный магазин с кол-вом этого sku больше нуля */
        AND (SELECT EXISTS(SELECT *
                           FROM store AS s
                             INNER JOIN sku_store AS ss ON s.id = ss.store_id AND quantity > 0
                           WHERE
                             s.active = 1 AND
                             ss.sku_id = VALUES(id)
        )
        )
  )
  );



Результат выполнения этого запроса - всем записям а таблице sku поле is_main_auto проставляется в 0

Если выполнить запрос, результат который я присваиваю в разделе "UPDATE" полю is_main_auto, с подставленными значениями из реальной таблицы (sku.id, sku.product_id и т.д.) тода возвращается правильный положительный ответ.

Подскажите пожалуйста, правильный ли я подход выбрал для решения задачи?
И если это можно назвать решением, то как сделать так чтобы оно работало.
Спасибо большое
...
Рейтинг: 0 / 0
Обновление записей таблицы по сложному условию
    #39667740
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ndashutinНаписал запрос, который (в теории) должен пробежаться по всем записям таблицы и проставить признак is_main_auto в 0 или 1 в зависимости от результата условия

Код: sql
1.
INSERT INTO

А Вы знаете, что запрос INSERT вставляет новую запись, а не обновляет существующую? А поскольку Вы вставляете в т.ч. и значение поля ID (как я понимаю, это уник, иначе вообще дурь получается), то у Вас ГАРАНТИРОВАННО дубль, т.е. гарантированный ODKU, и геморрой с INSERT-частью тупо лишний.

К сожалению, вопрос - "ниачём". Выбросите свои попытки, и формулируйте исходную задачу. На развёрнутой плоской структуре.
...
Рейтинг: 0 / 0
Обновление записей таблицы по сложному условию
    #39667774
ndashutin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Перед тем как приступать к задаче я нагуглил советы использования конструкций
Код: sql
1.
INSERT ... ON DUPLICATE KEY UPDATE


Почитав вот это https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html
И вот эту https://stackoverflow.com/questions/3432/multiple-updates-in-mysql статью на stackoverflow которая наталкнула меня на подобное решение

Поправте меня если я не прав, пожалуйста

Конструкция INSERT ODKU пытается вставить в таблицу перечень значений. В случае дублирования записи первичного ключа - можно указать нвое значения для перечня полей текущей записи (часть после ... UPDATE)? При этом в подзапросах можно использовать такие выражения как VALUES(var_name) которые берутся из текущей обновляемой строчки?

Или у меня совершенно неверное понимание о том, как работет эта конструкция?
...
Рейтинг: 0 / 0
Обновление записей таблицы по сложному условию
    #39667778
ndashutin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinandashutinНаписал запрос, который (в теории) должен пробежаться по всем записям таблицы и проставить признак is_main_auto в 0 или 1 в зависимости от результата условия

Код: sql
1.
INSERT INTO

А Вы знаете, что запрос INSERT вставляет новую запись, а не обновляет существующую?

Конечно знаю.
Я копирую таблицу sku в эту же таблицу чтобы гарантировано получить ODKU и обновить поле is_main_auto. При этом имею доступ к полям текущей записи.
Такая себе итерация, или не так?
...
Рейтинг: 0 / 0
Обновление записей таблицы по сложному условию
    #39667850
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ndashutinВ случае дублирования записи первичного ключа - можно указать нвое значения для перечня полей текущей записи (часть после ... UPDATE)? При этом в подзапросах можно использовать такие выражения как VALUES(var_name) которые берутся из текущей обновляемой строч1) Любого уника, не только первичного.
2) Всё то же доступно и в обычном UPDATE.
...
Рейтинг: 0 / 0
Обновление записей таблицы по сложному условию
    #39667875
ndashutin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Akina]ndashutin2) Всё то же доступно и в обычном UPDATE.

Я об этом не знал.
А можно примерчик симпл симпл

Спасибо огромное
...
Рейтинг: 0 / 0
Обновление записей таблицы по сложному условию
    #39668095
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примерчик ЧЕГО???
...
Рейтинг: 0 / 0
Обновление записей таблицы по сложному условию
    #39668289
ndashutin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina Примерчик ЧЕГО???

Понял что задал глупый вопрос

Из размышлений:

Понял что запрос можно переписать простым UPDATE. Дело в том, что sql переносил из кода. И естественно переносил подзапросами.

Понял что для начала можно написать SELECT запрос с применением всех условий. Запрос должен вернуть все записи таблицы которым теоретически можно присвоить is_main_auto = true

Дальше основываясь на этих условиях выполнить UPDATE

В лоб не понимал как выполнить эту задачу. В раздумиях и с вашего пинка пошел другим путем и все разложилось по полочкам
Спасибо
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Обновление записей таблицы по сложному условию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]