задача на сообразительность SQL

Модератор: Модераторы разделов

Аватара пользователя
Ratamahatta
Сообщения: 41

задача на сообразительность SQL

Сообщение Ratamahatta »

есть таблица в ней 3 поля:
- категория
- товар
- цена
потребно найти самый дорогой(или дешевый) товар в каждой категории

ограничение: одним запросом, но допустимы подзапросы, джойны и пр.

Никак не справлюсь :( ...
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: задача на сообразительность SQL

Сообщение serzh-z »

select n, c, max(p) from t7 group by c, n;
Спасибо сказали:
Аватара пользователя
Ratamahatta
Сообщения: 41

Re: задача на сообразительность SQL

Сообщение Ratamahatta »

serzh-z писал(а):
05.04.2007 17:56
select n, c, max(p) from t7 group by c, n;

не катит, это максимум внутри категории по КАЖДОМУ из товаров
Спасибо сказали:
Аватара пользователя
geshido
Сообщения: 17
ОС: Gentoo+ArchLinux+Ubuntu

Re: задача на сообразительность SQL

Сообщение geshido »

Ratamahatta писал(а):
05.04.2007 18:38
serzh-z писал(а):
05.04.2007 17:56

select n, c, max(p) from t7 group by c, n;

не катит, это максимум внутри категории по КАЖДОМУ из товаров


Код: Выделить всё

mysql> select * from products;
+----------+-------+----------+
| name     | price | category |
+----------+-------+----------+
| product1 |     1 | cat1     |
| product2 |     2 | cat1     |
| product3 |     4 | cat2     |
| product4 |     3 | cat2     |
+----------+-------+----------+
4 rows in set (0.01 sec)

mysql> select p1.name, p1.price, p1.category from products p1 where p1.price in (select max(p2.price) from products p2 where p2.category = p1.category) group by category;
+----------+-------+----------+
| name     | price | category |
+----------+-------+----------+
| product2 |     2 | cat1     |
| product3 |     4 | cat2     |
+----------+-------+----------+
2 rows in set (0.01 sec)

mysql>
Спасибо сказали:
Аватара пользователя
Ratamahatta
Сообщения: 41

Re: задача на сообразительность SQL

Сообщение Ratamahatta »

у меня решение такое:

Код: Выделить всё

SELECT
 cat,
 prod,
 price

FROM tab
INNER JOIN
(
    SELECT
     cat,
     MAX(price) AS price
    FROM tab
    GROUP BY cat

) AS temp
ON tab.cat=temp.cat AND tab.price=temp.price

правда меня беспокоит скорость на больших выборках ...

geshido, псб,
симпотично :), мне нравица поболе моего, токо это прокатит в mysql-карнации SQL, а мой вариант будет работать и в 1С8


У кого-нить есть еще ?
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: задача на сообразительность SQL

Сообщение serzh-z »

(Ratamahatta @ Apr 5 2007, в 20:08) писал(а):правда меня беспокоит скорость на больших выборках ...
Нормализуйте таблицу. Перенесите категории и имена товаров в отдельные таблицы.
Спасибо сказали: