MIN()

Name

Новичок
MIN()

Есть таблица
id | group_id | podgroup_id | name | price

Возможно вытащить по одному товару c минимальной ценой каждой подгруппы принадлежащие одной группе
Группа| Подгруппа | Минимальная цена
Холодильники | маленькие | 545
Холодильники | большие | 635
Холодильники | очень большие | 1254

Что то я городил ниче не выходит
SELECT *, min(price) FROM product WHERE group_id = 18 GROUP BY pg_id
Муть получается
 

.des.

Поставил пиво кому надо ;-)
все торможу :( пора спать.
[убран неверный ответ]
 

Name

Новичок
Да неработает это, неправильно она выбирает.
Например после этого
SELECT min(price), id FROM product WHERE group_id=18 GROUP BY pg_id

Минимальнай цена выбрана првильно, толко id c реальным не совпадает.
 

ForJest

- свежая кровь
SELECT min(price), podgroup_id ,id FROM product WHERE group_id=18 GROUP BY podgroup_id, id
 

Name

Новичок
Все подобные варианты уже проверял.
Тут что то посложнее.
 

ForJest

- свежая кровь
Да. Действительно посложнее. Ты результат агрегатной функции группируешь по одному полю, а хочешь получить данные другого поля - свободного. Я бы на месте мускула ругался матерными словами. И не позволял такого делать аще. Агрегатные направо, левые - налево.
 

chira

Новичок
SELECT group_id,podgroup_id,min(price) min_price
FROM product
GROUP BY group_id, podgroup_id

или посложнее
SELECT a.*
FROM product a, product b
WHERE a.group_id = b.group_id AND a.podgroup_id=b.podgroup_id
GROUP BY b.group_id, b.podgroup_id, a.id
HAVING a.price=MIN(b.price)
 

si

Administrator
Если я правильно понял автора вопроса, то все ответы выше не будут работать и тут нужет subselect которого как мы знаем нет в mysql, НО в доке есть конкретно пример как можно решить именно эту задачу в mysql.
 

.des.

Поставил пиво кому надо ;-)
si второй запрос chira действительно то что нужно с небольшим дополнением..
PHP:
SELECT a.*
FROM product a, product b
WHERE a.group_id =18 AND 
            a.group_id = b.group_id AND
            a.podgroup_id=b.podgroup_id
GROUP BY b.group_id, b.podgroup_id, a.id
HAVING a.price=MIN(b.price)
 

Name

Новичок
Вот так выбирает
SELECT a.* FROM product2 a, product2 b
WHERE a.group_id =18 AND a.group_id = b.group_id AND a.pg_id=b.pg_id
GROUP BY a.id
HAVING a.price = MIN(b.price)

но: поле прайс float(5.2) и если минимальная цена 0.33 то она пропускается
можно сделать CONCAT(a.price) = CONCAT(MIN(b.price)) или сделать поле double(5.2) - Что лучше?

И запрос из таблицы в 500 записей работает 0,20 сек, как то много наверное.
 

chira

Новичок
Запрос конечно "тяжелый" можно добавить индексы по полям group_id pg_id и заменить float(5,2) на decimal(5,2)

Могу предложить третий вариант который состоит из двух SQL, но должен работать намного быстрее:

CREATE TEMPORARY TABLE ppp
TYPE=HEAP
SELECT group_id, pg_id, min(price) FROM product
WHERE group_id = 18
GROUP BY pg_id

SELECT a.* FROM product2 a, ppp b
WHERE a.group_id = b.group_id AND a.pg_id=b.pg_id AND a.price=b.price
 

ForJest

- свежая кровь
Я все больше убеждаюсь, что SQL MySQL-я все менее и менее похож на стандарт :). Отсюда и желание странного... Хотя понять можно - 2000 человек напишут "а почему так нельзя"? И появляются странные возможности
 

Name

Новичок
С CREATE TEMPORARY TABLE горажде быстрее.
with CREATE TEMPORARY TABLE = 0.0148 cek (2 query)
without = 0.1834 сек

А что это нормально хранить цену в decimal,
проблем потом не будет?
 

chira

Новичок
Если вдруг появятся проблемы с точностью (ну станет нужно decimal(20,6)), то можно сделать alter table.
 
Сверху