Никак запрос не сооброжу...

Nik V. Polonski
Дата: 06.08.2003 13:39:58
Туплю что-то я. Есть таблица позиций lots (lot_id,lot_name) и цены на позиции prices (price_id, price_lot_id, price_value). Нужно получить выборку позиций с, например, 3-мя минимальными на них ценами. Спасибо за внимание и совет :)
Konrad
Дата: 06.08.2003 13:54:21

SELECT lots.lot_name, prices.price_value
FROM lots, prices
WHERE lots.lot_id=prices.price_lot_id
ORDER BY prices.price_value ASC
LIMIT 3
Konrad
Дата: 06.08.2003 14:00:53
Разумеется, в предложенный запрос в конструкцию WHERE вставляешь интересующую позицию (напр., AND lots.lot_name='Валенки').
Или в случае, если нужно выбрать все позиции, то в конструкцию ORDER BY перед prices.price_value нужно добавить lots.lot_name - для наглядности отображения.
Nik V. Polonski
Дата: 06.08.2003 14:09:00
2Konrad:
Штука вот в чем... на примере покажу...
есть лоты с ценами
валенки 1 2 3 4 5
лыжи 10 20 30 40

Нужный результат - это таблица
валенки 1
валенки 2
валенки 3
лыжи 10
лыжи 20
лыжи 30

Запрос
SELECT lots.lot_name, prices.price_value
FROM lots, prices
WHERE lots.lot_id=prices.price_lot_id
ORDER BY prices.price_value ASC
LIMIT 3
ограничит 3 записи вообще, это понятно... order by lots.lot_name тут не спасет никоим образом...
Конструкция с AND lots.lot_name='валенки' - даст только валенки. Можно, конечно, софтом это дело решить, но - хочется - одним запросом :)
seaman
Дата: 07.08.2003 11:56:20
select l.lot_name,p.price value from lots l,prices p where 3<(select count(*) from lots l1 , prices p1 where l1.lot_name=l.lot_name and p1.price_value<p.price_value) order by l.lots_name,p.prive_value desc;select l.lot_name,p.price_value from lots l,prices p where 3>(select count(*) from prices p1 where p1.price_value<p.price_value and l.lot_id=p1.price_lot_id) and l.lot_id=p.price_lot_id order by l.lot_name,p.price_value;



Попробуй так. У меня работает.
seaman
Дата: 07.08.2003 11:58:09
select l.lot_name,p.price_value from lots l,prices p where 3>(select count(*) from prices p1 where p1.price_value<p.price_value and l.lot_id=p1.price_lot_id) and l.lot_id=p.price_lot_id order by l.lot_name,p.price_value;

Сори. Заглючило и не удалило неправильный запрос. Вот правильный.
Nik V. Polonski
Дата: 07.08.2003 12:32:50
2seaman
Класс! Выглядит на 5+! Оч. понравилось :)) еще и работает :)
Правда, уже обошелся, вопрос интересовал с академической точки зрения))
Тут вот еще вариантик был (с)skondrat:
select l.lot_name, p.price_value from lots l, prices p where p.price_lot_id=l.lot_id AND p.price_id IN (select price_id from prices where prices.price_lot_id=l.lot_id order by price_value limit 3)
Всем спасибо :))
seaman
Дата: 07.08.2003 16:53:39
2Nik

Полностью согласен с вариантом от skondrat. Наверняка даже быстрее работать будет (PostgreSQL), но может не везде прокатить. А вон тот с выпендрнжем :) - это просто классика. Егор нужно знать и понимать. Довольно часто такое может попасться (даже на собеседованиях при приеме на работу).

По поводу варианта от skondrat - единственное могу только добавить что как правило (в PostgreSQL точно и во многих других БД) in(...) работает медленнее чем exists(...) (особенно в больших БД по 1 000 000+ записей в таблице ощущается конкретно в несколько раз по времени). Тоже нужно помнить, хотя запрос в этом случае будет выглядеть немного более громоздко и запутанно.

Это по поводу академической точки зрения.