Страница 1 из 1

SQL запрос

СообщениеДобавлено: Ср июл 22, 2009 19:58
Jedi
Вот не могу сообразить, как бы сделать запрос более оптимально. Есть таблица

id, cur, date, value
1, RUB, 2009-01-01, 10
2, USD, 2009-01-01, 20
3, EUR, 2009-01-01, 30
4, RUB, 2009-02-01, 40
5, USD, 2009-03-01, 50

cur и date являются индексами

Нужно вывести последние обновлённые валюты. я сделал так
Код: Выделить всё
select * from (select * from test order by date desc) t2 group by cur


выводится всё правильно, но нужно оптимизировать запрос чтобы использовались индексы. ибо данные пример будет плохо работать при большом объёме данных

Re: SQL запрос

СообщениеДобавлено: Ср июл 22, 2009 20:00
Jedi
знаю что как-то надо использовать во внутреннем запросе select max(date) и групировать по cur но чего то дальше никак. давно я с SQL не работал. позабыл уже всё :(

Re: SQL запрос

СообщениеДобавлено: Ср июл 22, 2009 20:26
Alkeeper
HAVING?

Re: SQL запрос

СообщениеДобавлено: Ср июл 22, 2009 21:40
Лесьяр
Да, да хевинг
SELECT * FROM test GROUP BY cur HAVING date = MAX(date)

Re: SQL запрос

СообщениеДобавлено: Ср июл 22, 2009 23:13
Jedi
нет. это не работает.
я вот как сделал
работает но вот с точки зрения оптимизации не знаю как

Код: Выделить всё
SELECT t1.* from test t1, (select max(date) dt from test group by cur) t2 where t1.date = t2.dt

Re: SQL запрос

СообщениеДобавлено: Чт июл 23, 2009 8:58
Лесьяр
C точки зрения оптимизации ужасно, а что за БД, если having не работает?

Re: SQL запрос

СообщениеДобавлено: Чт июл 23, 2009 10:43
Muerto
Jedi А кинь код создания таблицы!
У тебя там данные добавляются или апдейтятся?

Re: SQL запрос

СообщениеДобавлено: Пт июл 24, 2009 9:11
Jedi
mysql в денвере которая.
Таблицу делал в пхп май админе

С хэвингом он не выбирает ничего

Re: SQL запрос

СообщениеДобавлено: Пт июл 24, 2009 10:38
Muerto
Пришли дамп таблицы что-ли.

Re: SQL запрос

СообщениеДобавлено: Пт июл 24, 2009 10:47
Jedi
Код: Выделить всё
CREATE TABLE test (
  id int(11) NOT NULL auto_increment,
  cur varchar(5) NOT NULL,
  `date` datetime NOT NULL,
  `value` int(11) NOT NULL,
  PRIMARY KEY  (id),
  KEY cur (cur,`date`)
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=10 ;

Re: SQL запрос

СообщениеДобавлено: Пт июл 24, 2009 12:41
Muerto
Последние обновленные валюты - это как? У тебя праймари кей только по АйДи. Допустим мы выберем последние обновления валюты за последнее обновление даты. Если все валюты в один день обновляются, то хорошо. Иначе выборка только по обновленным:
select * from test where `date`=(select max(`date`) from test);
чтобы использовался индекс надо объявлять не KEY cur (cur,`date`). а KEY cur (`date`,cur) или
UNIQUE KEY cur (`date`,cur), если там не нужны дубликаты

Re: SQL запрос

СообщениеДобавлено: Пт июл 24, 2009 12:48
Jedi
Нужно чтобы они не повторялись. тлько одна валюта RUB, USD, и EUR вывести их по дате самой максимальной

Re: SQL запрос

СообщениеДобавлено: Пт июл 24, 2009 15:58
Padonak
этот топег разрывает мне моск

Re: SQL запрос

СообщениеДобавлено: Пт июл 24, 2009 18:12
Muerto
Жалея Падонка и по устной договоренности с Jedi, вопрос, полагаю, имеет быть закрытым.