Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Базы данных MySQL

  Все выпуски  

RusFAQ.ru: Базы данных SQL


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Базы данных SQL

Выпуск № 230
от 21.03.2007, 16:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 389, Экспертов: 49
В номере:Вопросов: 1, Ответов: 3


Вопрос № 78440: Приветствую уважаемых экспертов. Вопрос такой. Есть таблица товаров items с полями id, name, shop_id, price. name - текстовое поле, значение которого часто повторяется. Нужно создать запрос, который бы возвращал м...

Вопрос № 78.440
Приветствую уважаемых экспертов.

Вопрос такой.

Есть таблица товаров items с полями id, name, shop_id, price.

name - текстовое поле, значение которого часто повторяется.

Нужно создать запрос, который бы возвращал минимальную цену для каждого товара name и shop_id магазина, где продается товар по мин. цене.

Первое, что приходит в голову - такой запрос:
SELECT name, shop_id, MIN( price )
FROM items
GROUP BY name

Мин. цена определяется отлично, а вот shop_id при этом не соответствует магазину с мин. ценой. :( Похоже, mysql возвращает просто первое попавшееся значение для shop_id.

Как в данном случае правильно составить запрос?

P.S. В таблице ~7000 записей. Уникальных товаров ~700.

P.P.S. mysql 4.1

Приложение:

Отправлен: 15.03.2007, 16:10
Вопрос задал: Hurt (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 8)

Отвечает: Ерёмин Андрей
Здравствуйте, Hurt!
В данном случае можно использовать подзапросы. Вот пример:
SELECT `name`, `shop_id`,`price` FROM `items`
WHERE `price` = (SELECT MIN(`price`) FROM `items`)

Желаю удачи!
---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на Delphi. Помощь, советы, обмен опытом.
ICQ: 286867644
----
Ответ отправлен: 15.03.2007, 16:26
Оценка за ответ: 4

Отвечает: Pavel Maltsev
Здравствуйте, Hurt!

Попробуйте так, у меня работает:
SELECT t1.* FROM items t1
JOIN (SELECT name, MIN(price) price FROM items GROUP BY name) t2 ON (t1.name = t2.name and t1.price = t2.price)

Единственная проблема - если будут существовать два магазина с минимальной ценой, то на экран в результат попадут 2 магазина - не знаю уж хорошо это или плохо - зависит от Вашей задачи
Ответ отправил: Pavel Maltsev (статус: 1-ый класс)
Ответ отправлен: 15.03.2007, 16:37
Оценка за ответ: 5

Отвечает: Устинов Сергей Евгеньевич
Здравствуйте, Hurt!

Еремин Андрей предлагал Вам почти правильную идею реализации запроса.
Вот очень похожий запрос - но делает именно то, что Вам нужно.

SELECT `name` AS `namess`, `shop_id`, `price` FROM `items` WHERE `price`=(SELECT MIN(`price`) FROM `items` WHERE `name`=`namess`)

P.S. Классная все-таки штука SQL :)

Удачи!!
---------
Ждешь квалифицированного ответа? Задай правильно вопрос!
Ответ отправил: Устинов Сергей Евгеньевич (статус: Практикант)
Ответ отправлен: 17.03.2007, 02:53
Оценка за ответ: 5


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
ООО "Мастер-Эксперт Про", Москва, 2007
Авторские права | Реклама на портале
Версия системы: 4.46 от 18.03.2007
Яндекс Rambler's Top100

В избранное