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

SQL запрос

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

Re: SQL запрос

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

Re: SQL запрос

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

Re: SQL запрос

СообщениеДобавлено: Чт июл 23, 2009 0: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 9:58
Лесьяр
C точки зрения оптимизации ужасно, а что за БД, если having не работает?

Re: SQL запрос

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

Re: SQL запрос

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

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

Re: SQL запрос

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

Re: SQL запрос

СообщениеДобавлено: Пт июл 24, 2009 11: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 13: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 13:48
Jedi
Нужно чтобы они не повторялись. тлько одна валюта RUB, USD, и EUR вывести их по дате самой максимальной

Re: SQL запрос

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

Re: SQL запрос

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