Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2011, 19:31   #1
andrew_jr20
Пользователь
 
Регистрация: 01.06.2011
Сообщений: 53
По умолчанию выбрать последние цены

Добрый день.
Имеется таблица цен: Prices, с полями id, idproduct, price, pricedate. Как посредством sql выбрать последние цены, желательно с наименьшими затратами? А то способ, который использую сейчас, очень ресурсоёмкий: на тестовой базе с 20 видами товаров и порядка 2000 записей в таблице цен время на запрос - порядка полусекунды.
andrew_jr20 вне форума Ответить с цитированием
Старый 22.09.2011, 20:28   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

для увеличения производительности обычно применяются индексирование данных.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 22.09.2011, 20:46   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если нет записей по продукту с одинаковым pricedate - по каждому продукту будет одна запись, иначе несколько с разными price. И индексы в базе по idproduct и pricedate очень желательны (evg_m очень прав)
Код:
SELECT P1.idproduct,P1.price,P1.pricedate
  FROM Prices AS P1,
    (SELECT idproduct,MAX(pricedate) AS pricedate FROM Prices GROUP BY idproduct) AS P2
  WHERE P1.idproduct=P2.idproduct AND P1.pricedate=P2.pricedate
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.09.2011, 21:19   #4
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,184
По умолчанию

Например последние 10 цен (по дате)
Код:
SELECT * FROM Prices ORDER BY pricedate DESC LIMIT 0,10
или я чего то недопонимаю? Конкретнее сформулируйте - что такое последние цены
ADSoft вне форума Ответить с цитированием
Старый 22.09.2011, 22:00   #5
andrew_jr20
Пользователь
 
Регистрация: 01.06.2011
Сообщений: 53
По умолчанию

Имеется в виду то, что цены по товарам меняются каждый день (специфика деятельности), и получая данные по последней дате я, таким образом, получаю актуальные цены на товар. Индексация есть - проблема была именно в неоптимальности запросов. Нашёл быстрый и действенный способ:
Код:
SELECT *
FROM (
  SELECT *
  FROM Prices
  ORDER BY pricedate DESC
) AS s
GROUP BY idproduct;
Так что тему можно закрывать, спасибо за участие.

Последний раз редактировалось andrew_jr20; 22.09.2011 в 22:02.
andrew_jr20 вне форума Ответить с цитированием
Старый 22.09.2011, 23:39   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ничего не понял. В какой СУБД выше приведенный запрос будет рабочим и что он вернет в этом случае? Или ТС не до конца его нарисовал?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.09.2011, 09:24   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Аватар
Ничего не понял. В какой СУБД выше приведенный запрос будет рабочим и что он вернет в этом случае?
Аватар, +1

Любая нормальная СУБД выругается на него (попытка выбрать поля, не указанные в списке group by !)
Единственная СУБД, с которой я сталкивался и которая "плевала" на данное ограничение - была FPD (foxpro for dos). Она возвращала произвольные значения для полей, не указанных в group by!

Так же я согласен, непонятно, каким образом этот запрос отвечает потребностям автора!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.09.2011, 21:08   #8
andrew_jr20
Пользователь
 
Регистрация: 01.06.2011
Сообщений: 53
По умолчанию

В mysql всё отлично работает - подзапрос выдёргивает все поля (в том числе, pricedate и idproduct) в обратном порядке; после этого внешний запрос группирует по товару (idproduct), при этом в данные по каждому товару попадают последние данные, характерные именно этому товару.
andrew_jr20 вне форума Ответить с цитированием
Старый 26.09.2011, 21:57   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
В mysql всё отлично работает
да не может быть!

Вы хотите сказать, что у Вас сработает такой простой запрос?!!
Код:
SELECT *
  FROM Prices
  GROUP BY idproduct;
если это так (а мне сейчас лень лезть в мускул, чтобы проверить), тогда к списку "пофигистических" СУБД, которые "плевали" на стандарты SQL (я уже говорил выше про FPD) можно добавить и MySQL...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.09.2011, 22:21   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
В MySQL расширены возможности использования оператора GROUP BY. Теперь в выражениях SELECT можно использовать столбцы или вычисления, которые не присутствуют в части GROUP BY. Это справедливо для любой возможной величины для этой группы. Данная возможность позволяет повысить производительность за счет исключения сортировки и группирования ненужных величин. Например, в следующем запросе нет необходимости в группировке customer.name:

mysql> SELECT order.custid,customer.name,MAX(paym ents)
FROM order,customer
WHERE order.custid = customer.custid
GROUP BY order.custid;

В ANSI SQL к предложению GROUP BY необходимо добавлять customer.name. В MySQL, если работа происходит не в режиме ANSI, это имя избыточно.

Не используйте данное свойство, если столбцы, пропущенные в части GROUP BY, не являются уникальными в данной группе! Возможны непредсказуемые результаты.
Выделено мной
http://mysql.ru/docs/man/Group_by_functions.html
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 26.09.2011 в 22:39.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция генерации цены товара brulik67 PHP 6 15.06.2011 17:28
Зависимость цены от количества Alex Jordan БД в Delphi 0 31.05.2011 13:41
выбрать из строк последние, идущие после ключевой строки SarahConner Microsoft Office Excel 8 29.12.2010 22:42
Вывод цены AllForCS PHP 3 18.04.2010 09:18
Цены проектов leffet Свободное общение 7 17.02.2010 14:13