2013-05-10 10 views
7

Ich möchte Datensätze von '2013-04-01 00:00:00' bis 'today' auswählen, aber jeder Tag hat viel Wert, weil sie alle 15 Minuten einen Wert speichern , also möchte ich nur den ersten oder letzten Wert von jedem Tag.SQL: Wie wählen Sie einen Datensatz pro Tag, vorausgesetzt, dass jeden Tag mehr als 1 Wert enthalten MySQL

Tabellenschema:

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 ; 

Bad 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 ... 

ich alle wollen in einer möglichen, wenn ...

Danke sehr.

EDIT: Ich meine, ich habe eine Abfrage pro Tag, aber ich möchte nur eine einzelne Abfrage machen von reading_date >= '2013-04-01 00:00:00' c

EDIT2: Ich habe 64.260 Aufzeichnungen in diesen table.value_magnitudes und Es dauert sooooooooo lang, um diese Abfrage auszuführen und zu antworten, und manchmal eine Zeitüberschreitung.

Antwort

4

Um den ersten Eintrag für jeden Tag erhalten Sie

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) 
) 
+0

tun können, aber wenn ich tun, dass ich für jeden Tag eine Abfrage tun, bis ich heute erreichen, ist es möglich, in einer Abfrage? Vielen Dank. – rokimoki

+0

Ja, lassen Sie das Datum in der Where-Bedingung. Ich habe meine Antwort aktualisiert. –

+0

Aham, aber ich wollte ab X Datum, bis heute, also wäre es so etwas wie 'reading_date> = '2013-04-01 00: 00: 00'' – rokimoki

2
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) 
)