Выборка из таблици товар с минимальной ценой

Фарход

Новичок
Имеется таблица: products
Поля:
Уникальный ключь | Идентификатор товара | Цена товара
products_id | repairs_id | products_price |

Нужно выбрать поля, с минимальной ценой.
Делаю так:
PHP:
SELECT 
	products_id, repairs_id, min(products_price) as min

FROM 
	products

GROUP BY 
    repairs_id
Уникальный ключь таблици уникальный,
Идентификатор товара - не уникален, в данной таблице может существовать несколько товаров с разными ценами.
Мне нужно выбрать только те товары только с минимальной ценой в группе.
При запросе привиденном вище, он даёт товары с минимальной ценой, НО Уникальный ключь таблици этого поля не верен.
База данных mysql

Как нужно правильней составить запрос?
 

Фанат

oncle terrible
Команда форума
ключ пишется без мягкого знака.
если групп немного, то можно сделать несколько запросов, каждый в свою группу, с сортировкой по цене и лимитом 1
 

Placido

Наблюдаю
Не знаю, насколько это правильно, но я вижу такое решение:
PHP:
SELECT `t2`.`products_id`, `t1`.`repairs_id`, `t1`.`min` 
FROM (SELECT `repairs_id`, min(`products_price`) as `min` FROM `products` GROUP BY `repairs_id`) `t1` 
JOIN `products` `t2` ON `t1`.`min` = `t2`.`products_price` AND `t1`.`repairs_id` = `t2`.`repairs_id`;
 

WMix

герр M:)ller
Партнер клуба
Placido
каждый раз когда делаешь внутренний запрос, задумайся о его эфективности, возможно проще сделать 2 запроса, от этого можно выйграть хотябы дополнительной инфой внутреннего запроса в приложении и простотой модели...

PHP:
SELECT `repairs_id`, min(`products_price`) as `min` FROM `products` GROUP BY `repairs_id`
в этом запросе, products_price действительно минимальный, но repairs_id случайный
 

Placido

Наблюдаю
PHP:
SELECT `repairs_id`, min(`products_price`) as `min` FROM `products` GROUP BY `repairs_id`
в этом запросе, products_price действительно минимальный, но repairs_id случайный
Не понял глубины мысли. По repairs_id идет группировка, поэтому он один для всех сгруппированных products_price. Т.е. выбирается минимальный products_price для каждого repairs_id. А джойн с этой же таблицей нужен, чтобы найти products_id для заданной пары значений `repairs_id` и `products_price` (`min`).
 

WMix

герр M:)ller
Партнер клуба
дело было утром,спал еще.... но я исправлюсь
PHP:
SELECT 
	SUBSTRING( MIN( CONCAT( LPAD(`products_price`*100, 10, '0'), `products_id` )), 10 )*1,
	`repairs_id`, 
	min(`products_price`) as `min` 
FROM `products`
GROUP BY `repairs_id`
 

WMix

герр M:)ller
Партнер клуба
хотя я опять ошибся, я выбрал по одному продукту с минимальной ценой на каждый ремонт с минимальным индификатором...
да твой запрос правильный... стреляйте в меня!
 

Фарход

Новичок
Не знаю, насколько это правильно, но я вижу такое решение:
PHP:
SELECT `t2`.`products_id`, `t1`.`repairs_id`, `t1`.`min` 
FROM (SELECT `repairs_id`, min(`products_price`) as `min` FROM `products` GROUP BY `repairs_id`) `t1` 
JOIN `products` `t2` ON `t1`.`min` = `t2`.`products_price` AND `t1`.`repairs_id` = `t2`.`repairs_id`;
Спасибо, то что Вы предложили действительно подходит)))
 

Фарход

Новичок
Спасибо, то что Вы предложили действительно подходит)))
НО есть один момент который мне не ясен, если Вы объясните буду очень благодарен))

PHP:
 -- Выбирается данные которые мы хотим вывести
SELECT `t2`.`products_id`, `t1`.`repairs_id`, `t1`.`min` 
-- здесь у нас формируется вложенный запрос, что бы определить как я понял уникальность для products_id
FROM (SELECT `repairs_id`, min(`products_price`) as `min` FROM `products` GROUP BY `repairs_id`) `t1`
-- этот вложенный запрос мы определяем как алианс `t1`
-- далее у нас идет объединения 
JOIN `products` `t2`
-- и критерии обледенение 
ON `t1`.`min` = `t2`.`products_price` AND `t1`.`repairs_id` = `t2`.`repairs_id`;
-- не ясность тут)))

- JOIN `products` `t2`
откудого берется t2?????

Хотя нет)))
Понял)))
в жоине мы определяем таблицу `products` как `t2`
всем спасибо)))
 
Сверху