2013-05-10 20 views
7

Chcę wybrać rekordy od '2013-04-01 00:00:00' do 'today', ale każdy dzień ma dużo wartości, ponieważ zapisują co 15 minut wartość , więc chcę tylko pierwszą lub ostatnią wartość z każdego dnia.SQL: Jak wybrać jeden rekord na dzień, zakładając, że każdy dzień zawiera więcej niż jedną wartość MySQL

Tabela schematu:

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

Chcę wszystko w jednym, jeśli to możliwe ...

Dziękuję bardzo.

EDIT: Znaczy, mam zapytanie dziennie, ale po prostu chcę zrobić jedną kwerendę z reading_date >= '2013-04-01 00:00:00' c

EDIT2: mam rekordy w tej table.value_magnitudes i to zajmuje tyle czasu, aby wyłudzić i odpowiedzieć na to zapytanie, a czasem także na przekroczenie limitu czasu.

Odpowiedz

4

Aby uzyskać pierwszy wpis na każdy dzień można zrobić

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

ale jeśli to zrobię, że zrobię zapytanie za każdy dzień, dopóki nie osiągnie dzisiaj, jest to możliwe w jednej kwerendzie? dzięki. – rokimoki

+0

Tak, pozostaw datę w warunku, w którym. Zaktualizowałem swoją odpowiedź. –

+0

Aham, ale chciałem zacząć od X daty, do dzisiaj, więc byłoby to coś w stylu '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) 
)