SQL Einträge pro Stunde anzeigen lassen

Schumiel

Lieutenant
Registriert
Jan. 2010
Beiträge
840
Hallo,

ich möchte über die letzten 3 Tage die Einträge, die pro Stunde gemacht wurden, eintragen lassen. Zur Zeit mache ich das so:

SELECT count(id_test) FROM test WHERE datum LIKE '2010-07-".$d." ".$h."%'

Die beiden Variablen werden durch eine FOR-Schleife erzeugt. Somit erzeuge ich pro Aufruf 24 Querys für einen Tag und für ein ganzen Monat mal 30 Querys dazu. Lasse ich mir das ausgeben, dauert die Ausgabe mehrere Sekunden.

Feldtyp von "datum" ist "datetime" und kann auch nicht mehr geändert werden, weil zu viele Dateneinträge schon dranhängen.

Hat jemand eine Idee für eine ressourcenschonendere Abfrage?
 
Index/Indiz für Datum gesetzt?
 
SELECT COUNT(id) as neueAnzahl, date_format(datum, '%d.%m.%Y %k') als neuesDatum
FROM test
WHERE datum >= CURDATE() - INTERVAL 3 DAY
GROUP BY date_format(datum, '%d.%m.%Y %k')

Probier es mal so. Du kannst in SQL direkt nach einem bestimmten Datumsformat gruppieren.
 
Zuletzt bearbeitet:
Darklanmaster:
Ich kann es anpassen, wie ich will, es kommt immer der Fehler:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near

Stefan-:
Ausgabe: -> 32331 2010-07-06 20
Das kann nicht stimmen. In einer Stunde dürfte es nur ca. 500 Einträge gegeben haben.
 
Ups, da gehört natürlich auch kein * in das COUNT() rein. Zähl mal z.B. nach der id der Einträge, d.h. COUNT(id) as Anzahl, oder jedem anderen primären unique index.
 
Das ändert nichts. Gleiche Ausgabe.

Nachtrag:
Ich möchte die Einträge pro Stunde. Ich denke hier fasst er die Einträge von den letzten 3 Tagen zusammen.

Ich will die Einträge pro Stunde, aber der letzten 3 Tage. Also müsste ich 3 x 24 = 72 Ausgaben haben.
 
Kann ich nicht nachvollziehen. Bei mir geht es in einer Testtabelle einwandfrei:

CREATE TABLE `test1` (
`id` int(11) NOT NULL auto_increment,
`datum` datetime NOT NULL,
`wert` int(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=latin1

INSERT INTO `test1` (`id`, `datum`, `wert`) VALUES
(1, '2010-07-04 14:36:28', 1),
(2, '2010-07-05 11:36:31', 2),
(3, '2010-07-06 12:36:33', 3),
(4, '2010-07-07 13:36:35', 4),
(5, '2010-07-08 14:36:38', 5),
(6, '2010-07-04 11:36:41', 6),
(7, '2010-07-05 12:36:43', 7),
(8, '2010-07-06 13:36:46', 8),
(9, '2010-07-07 14:36:49', 9),
(10, '2010-07-08 11:36:51', 10),
(11, '2010-07-04 12:36:54', 11),
(12, '2010-07-05 13:36:57', 12),
(13, '2010-07-06 14:36:59', 13),
(14, '2010-07-07 11:37:02', 14),
(15, '2010-07-08 12:37:05', 15),
(16, '2010-07-04 13:37:07', 16),
(17, '2010-07-05 14:37:10', 17),
(18, '2010-07-06 11:37:12', 18),
(19, '2010-07-07 13:37:15', 19),
(20, '2010-07-08 13:37:18', 20);

SELECT COUNT( id ) AS neueAnzahl, date_format( datum, '%d.%m.%Y %k' ) AS neuesDatum
FROM test1
WHERE datum >= CURDATE( ) - INTERVAL 3
DAY
GROUP BY date_format( datum, '%d.%m.%Y %k' )
LIMIT 0 , 30

Full Texts
neueAnzahl neuesDatum
1 05.07.2010 11
1 05.07.2010 12
1 05.07.2010 13
1 05.07.2010 14
1 06.07.2010 11
1 06.07.2010 12
1 06.07.2010 13
1 06.07.2010 14
1 07.07.2010 11
2 07.07.2010 13
1 07.07.2010 14
1 08.07.2010 11
1 08.07.2010 12
1 08.07.2010 13
1 08.07.2010 14

Was für eine MySQL-Version benutzt du? Du benutzt doch MySQL, oder?
 
Mein Fehler scheint wohl hier zu liegen:
"date_format( datum, '%d.%m.%Y %k' ) " ... dafür habe ich Werte für die Tests eingesetzt.

So funktioniert der SQL-Befehl. Super.

Das einzige Problem, was ich in meinem Eingangsbeitrag nicht klar schilderte war, dass ich halt eine Übersicht machen möchte von Tag x. Also z.B. vom 5.7., 6.7. und 7.7. und das von 0 bis 23:59 Uhr, aber eben in dem Stundenthythmus! Eben die letzten 3 Tage.
 
Und wo ist jetzt genau das Problem? Der SQL-Befehl gibt dir doch eine schicke Übersicht, und zwar genau so wie in meinem letzten Quote. Daraus kannst du mit was auch immer für einer serverseitigen Sprache - ich nehme mal an, du benutzt PHP - was schickes bauen.
 
Zurück
Oben