Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Обновление записей таблицы по сложному условию / 8 сообщений из 8, страница 1 из 1
29.06.2018, 18:04
    #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
29.06.2018, 20:11
    #39667740
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записей таблицы по сложному условию
ndashutinНаписал запрос, который (в теории) должен пробежаться по всем записям таблицы и проставить признак is_main_auto в 0 или 1 в зависимости от результата условия

Код: sql
1.
INSERT INTO

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

К сожалению, вопрос - "ниачём". Выбросите свои попытки, и формулируйте исходную задачу. На развёрнутой плоской структуре.
...
Рейтинг: 0 / 0
29.06.2018, 22:47
    #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
29.06.2018, 23:10
    #39667778
ndashutin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записей таблицы по сложному условию
AkinandashutinНаписал запрос, который (в теории) должен пробежаться по всем записям таблицы и проставить признак is_main_auto в 0 или 1 в зависимости от результата условия

Код: sql
1.
INSERT INTO

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

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

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

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

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

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

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

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

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

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


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