Я хочу выбрать записи с '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
и требуется sooooooooo для исключения и ответа на этот запрос, а иногда и на тайм-аут.
Чтобы получить первую запись за каждую дату, которую вы можете сделать
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) )
select * from value_magnitudes where id in ( SELECT min(id) FROM value_magnitudes WHERE `value_magnitudes`.`reading_date` BETWEEN '$from_selected' AND '$to_selected' and (magnitude_id = 234) group by date(reading_date) )