Mysql процедури для чайників - stack overflow російською

Маю дві таблиці з товарами інтернет магазину. В одну потрапляють тільки товари від різних постачальників із зазначенням ID постачальника. У другу потрапляють всі ціни і наявність по кожному товару першої таблиці, по кожному складу постачальника.

Так як SQL недавно з'явився в моєму житті в таких масштабах, доводиться просити допомоги, не в усьому сам можу розібратися.

Коротко про дані в таблицях:

Таблиця з товарами виглядає ось так

Таблиця з цінами так

Як видно на зображеннях, на один товар може припадати кілька різних цін на різних складах. Написав процедуру для усереднення цін по складах кожного постачальника.

Не можу сказати що добре написав, досвіду не вистачає, можливо і заглючить при нульовій ціні або кількості, але поки працює.

Процедуру виконую в PHP скрипт - роблю вибірку всіх id, in_id, sup_id з таблиці items і підставляю їх в мою процедуру, викликаючи її в циклі перебору цієї самої вибірки. Грубо кажучи

Так, ідея банальна і не найпродуктивніша ..

Після виконання процедури таблиця заповнюється цілком коректно

Власне, питання: Зараз на 10 тисяч наявних в таблиці items записів виконання всього мого скрипта займає аж 10 хвилин (на ноутбуці). Це нікуди не годиться, я прекрасно розумію що якщо об'єднати foreach PHP і SQL в одній єдиній процедурі, процес піде набагато швидше. Але досвіду не вистачає. Підкажіть, будь ласка, методи оптимізації всієї цієї "вибірки". Другий день б'юся з sql курсором і змінними, результату і розуміння 0

заданий 19 Серпня '16 о 1:40

Підхід, при якому ваш PHP-скрипт проходиться по таблиці і оновлює поле у ​​кожному записі, звичайно, дуже повільний. 10 хвилин ще не так багато. Коли ваша таблиця стане більше, чекати доведеться набагато довше.

А чи дійсно вам потрібно зберігати поле із середньою ціною? Якщо ви хочете отримати список товарів із середніми цінами можна використовувати запит:

Можна на основі запиту зробити view і буде подання вихідної таблиці, але з додатковим полем що містить усереднену ціну.

Всі ціни за всіма записами зберігаються в таблиці. Обчислювати середню ціну необхідно, тому що представлені вище таблиці не є остаточними. Так як дані в таблиці td_items не рідкість (один і той же товар може бути від різних постачальників з різних sup_id і однаковим in_id), інша велика процедура зливає їх в одну кінцеву таблицю, порівнюючи ціни між однаковими записами (по артикулу, моделі і бренду) і виставляє мінімальну з середніх цін, із зазначенням для якого постачальника ця ціна діє. - Andrew Koshkin 19 Серпня '16 о 10:51

У мене лише одне питання - як зробити перегородку усіх рядків таблиці td_items в процедурі, виключаючи цю обробку в PHP. Тобто зараз я беру все записи з таблиці за допомогою php, перебираю їх і виставляю ціну. Можна цю ж процедуру виконати прямо в SQL процедурі? - Andrew Koshkin 19 Серпня '16 о 10:53

Схожі статті