SQL: как выбрать одну запись в день, предполагая, что каждый день содержит более 1 значения MySQL

Я хочу выбрать записи от '2013-04-01 00:00:00' до 'today', но каждый день имеет большое значение, потому что они сохраняют значение каждые 15 минут, поэтому мне нужно только первое или последнее значение каждого дня.

Схема таблицы:

CREATE TABLE IF NOT EXISTS `value_magnitudes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `value` float DEFAULT NULL,
  `magnitude_id` int(11) DEFAULT NULL,
  `sdi_belongs_id` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `reading_date` datetime DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1118402 ;

Неверный SQL:

SELECT value FROM `value_magnitudes` WHERE `value_magnitudes`.`reading_date` BETWEEN '2013-04-01 00:00:00' AND '2013-04-02 00:00:00' AND (`value_magnitudes`.magnitude_id = 234) LIMIT 1
SELECT value FROM `value_magnitudes` WHERE `value_magnitudes`.`reading_date` BETWEEN '2013-04-02 00:00:00' AND '2013-04-03 00:00:00' AND (`value_magnitudes`.magnitude_id = 234) LIMIT 1
SELECT value FROM `value_magnitudes` WHERE `value_magnitudes`.`reading_date` BETWEEN '2013-04-03 00:00:00' AND '2013-04-04 00:00:00' AND (`value_magnitudes`.magnitude_id = 234) LIMIT 1
SELECT value FROM `value_magnitudes` WHERE `value_magnitudes`.`reading_date` BETWEEN '2013-04-04 00:00:00' AND '2013-04-05 00:00:00' AND (`value_magnitudes`.magnitude_id = 234) LIMIT 1
SELECT value FROM `value_magnitudes` WHERE `value_magnitudes`.`reading_date` BETWEEN '2013-04-05 00:00:00' AND '2013-04-06 00:00:00' AND (`value_magnitudes`.magnitude_id = 234) LIMIT 1
etc ...

Я хочу все в одном, если это возможно...

Большое тебе спасибо.

EDIT: я имею в виду, что у меня есть запрос в день, но я просто хочу сделать один запрос из reading_date >= '2013-04-01 00:00:00'c

EDIT2: У меня есть 64 260 записей в этом table.value_magnitudes, и выполнение и ответ на этот запрос занимает ооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооокок по тайм-ауту соединения.


person Alejandro L.    schedule 10.05.2013    source источник


Ответы (1)


Чтобы получить первую запись для каждой даты, вы можете сделать

select * from value_magnitudes
where id in 
(
    SELECT min(id)
    FROM value_magnitudes
    WHERE magnitude_id = 234
    and date(reading_date) >= '2013-04-01'
    group by date(reading_date)
)
person juergen d    schedule 10.05.2013
comment
но если я это сделаю, я буду делать запрос на каждый день, пока не доберусь до сегодняшнего дня, возможно ли это в одном запросе? благодаря. - person Alejandro L.; 10.05.2013
comment
Да, оставьте дату в условии «где». Я обновил свой ответ. - person juergen d; 10.05.2013
comment
Ахам, но я хотел начать с даты X до сегодняшнего дня, чтобы было что-то вроде reading_date >= '2013-04-01 00:00:00' - person Alejandro L.; 10.05.2013
comment
Хорошо, спасибо, проиндексировал, но все равно не работает, но все равно спасибо =D - person Alejandro L.; 10.05.2013
comment
используйте explain, чтобы увидеть, в чем проблема. Вот так: explain select * from ..... Если у вас не получится, вы можете задать другой вопрос. - person juergen d; 10.05.2013
comment
Я думаю, проблема в том, что функция date делает индекс бесполезным. - person juergen d; 10.05.2013
comment
Единственное решение, которое я вижу на данный момент, - это разбить дату и время на 2 разных столбца. Но, возможно, есть лучшее решение, о котором я не знаю. - person juergen d; 10.05.2013
comment
Я задал новый вопрос: stackoverflow .com/questions/16481049/ - person Alejandro L.; 10.05.2013