2012-02-02 9 views
6

Mam tabelę, która otrzymuje setki żądań na minutę. Problem, który mam, polega na tym, że potrzebuję sposobu na wybranie tylko tych wierszy, które wstawiono w ciągu ostatnich 5 minut. Próbuję tego:Wybierz wiersze, które są starsze niż 5 minut, używając DATE_SUB

SELECT count(id) as count, field1, field2 
FROM table 
WHERE timestamp > DATE_SUB(NOW(), INTERVAL 5 MINUTE) 
ORDER BY timestamp DESC 

Mój problem polega na tym, że zwraca 70k + wyniki i zliczanie. Nie jestem pewien, co robię źle, ale chciałbym uzyskać pomoc w tej sprawie. Ponadto, gdyby nie było sposobu na grupie nich przez minutę, aby to wyglądać tak:

| count | field1 | field2 | 
---------------------------- 

chęcią pomocy i kierunek na ten temat, więc proszę dać mi znać swoje myśli.

+0

Jaki jest typ 'timestamp' kolumnie? – Tadeck

+0

@Tadeck to datetime, czy to ma znaczenie? –

+3

To robi wielką różnicę, ponieważ niektórzy ludzie używają 'INT' do przechowywania znaczników czasu. Różni się także od typu "TIMESTAMP", ponieważ 'DATETIME' jest traktowany dosłownie i nie dostosowuje się do strefy czasowej. Może to być problem - porównaj znacznik czasu ostatnio wstawionego wpisu z wynikiem "WYBIERZ TERAZ(); i daj nam znać o wartościach obu. – Tadeck

Odpowiedz

2

Poniższa wydaje się, że to działa, który jest potężny blisko tego, co miał:

SELECT 
    MINUTE(date_field) as `minute`, 
    count(id) as count 
FROM table 
WHERE date_field > date_sub(now(), interval 5 minute) 
GROUP BY MINUTE(date_field) 
ORDER BY MINUTE(date_field); 

Uwaga dodana kolumna pokazać minutę i klauzuli GROUP BY, która gromadzi się wyniki w odpowiedniej chwili. Wyobraź sobie, że masz 5 małych wiaderek opatrzonych etykietą z ostatnich 5 minut. Teraz wyobraź sobie, że rzuciłeś każdy wiersz, który miał 4 minuty, do własnego wiadra. count() następnie policzy liczbę wpisów znalezionych w każdym wiadrze. To jest szybka wizualizacja działania GROUP BY. http://www.tizag.com/mysqlTutorial/mysqlgroupby.php wydaje się być porządnym zapisem w GROUP BY, jeśli potrzebujesz więcej informacji.

Jeśli to uruchomisz, a liczba wpisów w każdej minucie wydaje się zbyt wysoka, zrób to, aby rozwiązać problem. Spróbuj zmienić COUNT (id) na MAX (date_field) i MIN (date_field), abyś mógł się zorientować, jakie dane przechwytuje. Jeśli MIN() i MAX() znajdują się w tym zakresie, możesz mieć więcej danych zapisanych w bazie danych, niż zdajesz sobie z tego sprawę.

Możesz także dwukrotnie sprawdzić, czy nie masz dat w przyszłości, ponieważ wszystkie byłyby> teraz(). Kontrole MIN()/MAX(), o których mowa powyżej, powinny również wskazywać, że jest to problem.

+0

Dobrze napisana odpowiedź – phpmeh

10

Tak naprawdę nie potrzeba DATE_ADD/DATE_SUB, data arytmetyka jest znacznie prostsza:

SELECT COUNT(id), DATE_FORMAT(`timestamp`, '%Y-%m-%d %H:%i') 
FROM `table` 
WHERE `timestamp` >= CURRENT_TIMESTAMP - INTERVAL 5 MINUTE 
GROUP BY 2 
ORDER BY 2 
Powiązane problemy