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

SI
На сайте с 19.12.2007
Offline
77
929

задачка:

в бд хранится информация о ценах в магазинах на разные сорта яблок в виде

... магазин1 сорт1 цена ...

... магазин2 сорт1 цена ...

... магазин3 сорт2 цена ...

и т.д., к примеру

1 1 65

2 1 50

3 2 55

нужно выбрать строки с наименьшей ценой каждого сорта, чтобы на выходе была выборка

магазин2 сорт1 цена

магазин3 сорт2 цена

для своего примера результат получается

2 1 50

3 2 55

может, стоит копать от доп.выборки что-то типа (select distinct sortyablok ORDER BY price),

но чот никак не соображу, ступор просто какой-то

рисуем, верстаем, кодим и крутим ...аа, да, еще принимаем заказы (:
kanonir
На сайте с 27.10.2010
Offline
2
#1

Попробуйте "SELECT * FROM `bd_name` WHERE price=MIN(price)"

мой блог (http://comphobby.ru)
SI
На сайте с 19.12.2007
Offline
77
#2

или что-то типа SELECT MIN(price) ... GROUP BY sortyablok, но такой запрос не вернет инфу, в каком магазине эта цена

Polimer
На сайте с 01.09.2006
Offline
84
#3

Попробуйте копать вот в эту сторону (сваял на коленке, не проверял):


SELECT Shop, Sort, Price

FROM ( SELECT
P1.Sort, Min(P1.Price) AS MinPrice
FROM
Prices AS P1
GROUP BY Sort
) AS PriceGroups

INNER JOIN
Prices AS P2
ON ( P2.Sort = PriceGroups.Sort
AND P2.Price = PriceGroups.MinPrice
)

Да... А какая СУБД используется? В MS SQL здесь можно немного упростить, использовав, к примеру, ROWNUMBER OVER PARTITION

Программные решения для бизнеса. (http://frontsoft.ru/) На заказ. Дорого.
SI
На сайте с 19.12.2007
Offline
77
#4

mysql

с ходу не получилось, выдает Column 'Sort' in field list is ambiguous, но буду вникать, спасибо за идею

Polimer
На сайте с 01.09.2006
Offline
84
#5
St.I.An:
Column 'Sort' in field list is ambiguous, но буду вникать, спасибо за идею

Эт он справедливо ругается, что в обоих выборках это поле одинаково зовется и не знает какое выбрать. Надо в селекте конкретизировать:

SELECT	P2.Shop, P2.Sort, P2.Price
L
На сайте с 07.12.2007
Offline
351
#6
SELECT magazin, sorte, min(Cost) FROM TableName GROUP BY magazin, sorte SORT BY magazin, sorte

Будет:

Магазин1-Сорт1-МинЦена

Магазин1-Сорт2-МинЦена

Магазин1-Сорт3-МинЦена

Магазин2-Сорт1-МинЦена

Магазин2-Сорт2-МинЦена

. . .

S
На сайте с 14.04.2008
Offline
60
#7

Жаль, что тут не принято задачки на запросы сопровождать подготовленным DDL для того, чтобы можно было не напрягаясь проверить решения... Попробуйте так (должно работать, но создавать тестовую таблицу для проверки самому лениво):

SELECT a.store,a.grade,a.price

FROM tbl a
INNER JOIN (
SELECT grade,min(price) min_price FROM tbl
GROUP BY 1
) b ON a.grade=b.grade AND a.price=b.min_price
SI
На сайте с 19.12.2007
Offline
77
#8

может, и принято, я просто впервые спрашиваю, не учёл сей момент. спасибо за помощь, правда, пока не работает...

CREATE TABLE test (

id INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,

id_shop INT NOT NULL ,

id_grade INT NOT NULL ,

price INT NOT NULL

)

INSERT INTO test (id, id_shop, id_grade, price) VALUES

(NULL , 1, 1, 50),

(NULL , 1, 2, 45)

(NULL , 1, 3, 55),

(NULL , 2, 1, 60),

(NULL , 2, 2, 35);

S
На сайте с 14.04.2008
Offline
60
#9

Так а что не работает-то? Вот что выдал мой запрос по вашим данным:

mysql> select a.id_shop,a.id_grade,a.price from test a inner join ( select id_grade,min(price) min_price from test group by 1) b on a.id_grade=b.id_grade and a.price=b.min_price~~~

+---------+----------+-------+
| id_shop | id_grade | price |
+---------+----------+-------+
| 1 | 1 | 50 |
| 1 | 3 | 55 |
| 2 | 2 | 35 |
+---------+----------+-------+
3 rows in set (0.00 sec)

Что не так? Отсортировать по сорту забыл? :)

SI
На сайте с 19.12.2007
Offline
77
#10

работает, факт, ща свои руки подвыпрямлю и перепишу запрос под основную базу!! (:

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий