SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 12.01.2016 18:10:52

Катерина89
Участник
Зарегистрирован: 12.01.2016
Сообщений: 1

Обновление минимальных цен с приоритетами

Приветик всем!

Предыстория:
Жил был маленький магазинчик, и было легко помогать его строить. И тут случилась продажа 50%, и второй владелец, который хочет все поменять, что и не странно, потенциал есть. Количество товаров сильно увеличилось, как и количество поставщиков, и свалилось все на мои хрупкие плечики.

Подскажите, столкнулась с такой проблемой. Логика строилась давно, а знаний сильно не добавилось, скорее всего вина во всем моя( хнык.

Сейчас около 10тыс товаров, и есть иерархия поставщиков, у каждого свой приоритет от 1 до 3. Цены и позиции у поставщиков могут быть одинаковыми.

Приоритет 1 - все товары поставщика, даже если стоимость выше минимальной цены, должны отображаться в 1 очередь.
Приоритет 2 - проверенные поставщики, отображаются в остальных товарах, по минимальной цене.
Приоритет 3 - непроверенные поставщики, ими нужно заполнить товары, незаполненные поставщиками 1 и 2 приоритета.

Цены считываются в промежуточную базу, откуда я выгружаю (пока только планирую) их в основную, стараюсь все максимально делать через mysql.
Нужно быстро и незаметно для покупателей производить обновление цен в магазине. Сейчас обновление парализует магазин на 5 мин.

Структуры таблиц
products
id int
product_name varchar
product_vendor varchar
price decimal
priority smallint

Индексы
int
product_name


до чего сама смогла додуматься:
- создать новую таблицу
CREATE TABLE products_update LIKE products

- туда данные с минимальными ценами
SELECT DISTINCT product_name, product_vendor, min(price) AS price FROM products GROUP BY product_name;

- запросом с подзапросом обновить цены основываясь на приоритете
пытаюсь выбрать самые низкие цены и высший приоритет
UPDATE products_update t
SET t.price = (
SELECT min(p.price) FROM products p WHERE t.name = p.name AND t.priority > p.priority)
WHERE t.priority > 1;

Отредактированно Катерина89 (12.01.2016 18:16:46)

Неактивен

 

#2 13.01.2016 20:02:47

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Обновление минимальных цен с приоритетами

Если честно, не очень понял, какую проблему Вы пытаетесь решить — медленное обновление или написать запросы, которые реализуют бизнес-логику?

Если первое, то проще всего действительно заполнять новую табличку, а потом делать одновременное переименование таблиц: RENAME products TO products_old, products_new TO products. Тогда Вы подкладываете просто новый слепок данных, и пользователи ничего не замечают.

Если второе, то я бы просто последовательно заполнял таблицу для трех видов приоритетов (высший к низшему), при этом не перезаписывая данные (INSERT IGNORE).

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson