Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
ну просто крутой запрос... (Victor) 28/01/2002 - 17:08:15
      Re: ну просто крутой запрос... (Василий) 28/01/2002 - 18:06:31
      Re: ну просто крутой запрос... (Victor) 31/01/2002 - 05:27:23

> Original message text:
> From: Victor - 28/01/2002 - 17:08:15
> Subject:ну просто крутой запрос...
> -----------------
> Добрый день люди добрые!
>
> Прошу помощи в написании одного простого запроса, но почему то я все никак его не могу написать, а суть такова:
>
> Есть таблица с данными:
> --------------------------------------
> | prop_id | prod_id | cust_id | price
> |-------------------------------------
> | 1 191 12 124
> | 2 191 13 132
> | 3 191 12 133
> | 4 191 14 122
> | 5 165 11 124
> | 6 165 13 132
> | 7 181 12 133
> | 8 134 12 122
>
> и требуется написать запрос результатом выполнения которого будет:
>
> 1. сгрупирует все записи по prod_id, для каждого prod_id вычислит max цену из предложенных всеми cust_id для данного prod_id. (это я сделал это легко)
> 2. вернет след результат:
> prod_id, max price, cust_id (который предложил эту цену)
>
> Первые два столбца всегда возвращаются правильно, а во последний возвращается как то странно в зависимости от порядка следования записей в группе, как правило этот столбец имеет значение первой строки из группы...а нужно значение которое отражает cust_id которые и предложил этот max price !
>
> Буду очень признателен за любую помощь :)
> Заранее всем огромное спасибо кто дочитал до этого места :)
>


From: Василий - 28/01/2002 - 18:06:31
Subject:ну просто крутой запрос...
-----------------
почему не работает.
потому что запрос типа

select f1,max(f2),f3 from t1 group by f1

действительно возвращает f3 первой по порядку записи для которой f1 имеет данное значение. Потому что иначе неясно, какое f3 брать. Если бы ты, допустим, выбирал

select f1,max(f2),f3, min(f4) from t1 group by f1

то какое занчение f3 брать? то, которое соотв. мин. f4 или макс. f2?

более того, в прочих субд это вообще бы была ошибка синтаксиса - отсутствие группвой функции для поля f3. а в mysql такая возможность введена, на мой взгляд, чтобы хоть как-то, в каких то случаях, компенсировать отсутствие других возможностей (подзапросы и проч).

что делать.

как обычно. либо на клиенте скриптом пробегать, либо с временной таблицей. второй вариант так (индексы создавать надо, когда много записей в этой таблице) :

создать индекс по (prod_id, price)

каждый раз, когда надо делать эту самую выборку

drop table if exists tmp1;
create temporary table tmp1 as select prod_id, max(price) price from tabname group by prod_id;
create index nd_tmp1 on tmp1(prod_id, price);
select t1.prod_id, t1.cust_id, t1.price from tabname t1 inner join tmp1 on (t1.prod_id = tmp1.prod_id and t1.price = tmp1.price);
drop table if exists tmp1; (чтоб не засорять память)


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
1717



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |