Xpoint
   [напомнить пароль]

Поиск минимальной цены в прайсах поставщиков

Метки: [без меток]
2018-09-19 14:12:35 [обр] sfumato2[досье]

Добрый день.
Помогите, пожалуйста, сделать sql запрос?
Суть такова, что нужно выбрать минимальную цену из прайса, в котором ВСЕ поставщики указывают свою цену

*price
id автоматом
id|categoria_id| note_id
1 | 1 | 1
2 | 1 | 2
3 | 1 | 3
4 | 1 | 4

*categoria
id автоматом
id|categoria_id|name
1 |1 |болт м6
2 |2 |болт м7
3 |3 |болт м8
4 |4 |болт м9

*note
id автоматом
id|note_id|name
1 |1 |медь
2 |2 |люминий
3 |3 |цинк
4 |4 |золото
 
*price_all
id автоматом
id|categoria_id|note_id|price|postavshik
1 |1 |1 |750 |1
2 |1 |1 |650 |2
3 |1 |1 |700 |3
4 |1 |1 |750 |4
5 |1 |2 |750 |1
6 |1 |2 |650 |2
7 |1 |2 |700 |3
8 |1 |2 |150 |4

нужно что бы было так:
1 |болт м6 |медь |650|2 (там есть еще и таблица поставщиков, которые я потом заменю с 2 на ООО"какое-то"
8 |болт м6 |люминий|150|4

я могу по средствам LEFT JOIN пристыковать болты и металл, но вот выбрать минимальное значение из price_all не могу.
пробовал MIN(price), но у всех значений у меня получается 150.
помогите пожалуйста.

спустя 1 час 23 минуты [обр] sfumato2[досье]

ну, почти получилось:
per_id - много разных поставщиков
t_id1 - категория
t_id2 - описание
prices - цена поставщика
     
SELECT * FROM price_route
WHERE price_route.per_id=1 AND price_route.t_id1=1 and id IN (SELECT MIN(id) FROM price_route INNER JOIN (
    SELECT MIN(prices) AS minPrices, t_id2 FROM price_route GROUP BY t_id2 ) AS mps
    ON price_route.prices=mps.minPrices AND price_route.t_id2=mps.t_id2 GROUP BY price_route.t_id2 )
    
id per_id t_id1 t_id2 sklad prices tf date time
       7 1 1 1 1 700 0 2018/07/30 15:30
       18 1 1 2 1 190 0 2018/07/30 15:30
       19 1 1 3 1 195 0 2018/07/30 15:30
       20 1 1 4 1 295 0 2018/07/30 15:30
       23 1 1 15 1 299 0 2018/07/30 15:30

все как бы получилось. я выбираю поставщика и мне его товары. выбираю t_id1 и получаю нужный список.
но теперь у меня не получается "внедрить" вместо t_id1 текст из таблицы

пробую так:

SELECT *, categoria1.name FROM price_route
WHERE price_route.per_id=1 AND price_route.t_id1=1 and id IN (SELECT MIN(id) FROM price_route INNER JOIN (
    SELECT MIN(prices) AS minPrices, t_id2 FROM price_route GROUP BY t_id2 ) AS mps
    ON price_route.prices=mps.minPrices AND price_route.t_id2=mps.t_id2 GROUP BY price_route.t_id2 )
LEFT join categoria as categoria1 on categoria1.id = price_route.t_id1

и мускул ругается на left join
блин, что не так то ?!

спустя 6 часов [обр] Евгений Седов aka KPbIC(10/187)[досье]
*price
id автоматом
id|categoria_id| note_id
Это что вы хотели сделать?
спустя 2 часа 25 минут [обр] sfumato2[досье]

*price
таблица прайс.
id автоматом
ид - автоинкремент
id|categoria_id| note_id
имена столбцов

в итоге разобрался. LEFT join перенес до WHERE . мускл ругалось на то, что ID не обозначено явно. SELECT MIN(id) указал таблицу и все полетело

спустя 18 минут [обр] Евгений Седов aka KPbIC(10/187)[досье]
Когда описываете таблицы, про автоинкремент писать не надо, а вот первичный и внешние ключи указать не помешало бы.
Что означают поля categoria_id и note_id, и где в таблице price собственно цена?
спустя 21 час [обр] sfumato2[досье]

первичный ключ - знаю что за зверь, обычно на id его вешаю.
а что такое внешние ключи ?

её (цены) там нет. ))
Это "матрица" по которой в price_all ВСЕ поставщики добавляют свою цену.
это такая заморочка потому, что не всем поставщикам можно ставить цену на все товары. им "открывают" позиции и они ставят цену. тут просто не все таблицы указаны.

спустя 2 часа 10 минут [обр] Евгений Седов aka KPbIC(10/187)[досье]

Вы не ответили на вопрос про поля categoria_id и note_id - что они означают?

Про внешние ключи погуглите, материала полно. Если кратко, то это первичный ключ из другой таблицы.

Первичный ключ однозначно определяет запись. У вас могут быть несколько записей с одинаковыми парами categoria_id + note_id?

Вот у вас есть таблица price. Таблица это сущность. В коде она будет представлена классом/модулем/etc. Класс, во-первых, должен как-то соответствовать названию и, во-вторых, содержать только поля, присущие ему. У вас, похоже, проблемы с определением сущностей.

Powered by POEM™ Engine Copyright © 2002-2005