yves030: mega komplizierter query...

Beitrag lesen

Wow..

das war der Kick in die richtige Richtung.

Die Lösung liest sich einfacher als erwartet:

_I_ = gewünschtes Intervall
_S_ = Startzeit
_E_ = Endzeit
_L_ = max. Anzahl Zeilen

SELECT CAST(created/_I_ AS UNSIGNED) AS g,count(*) FROM test WHERE created BETWEEN _S_ AND _E_ GROUP BY g LIMIT _L_

Allerdings hat diese Lösung eine (leider) entscheidende Schwäche...
sie liefert keine Zeilen, in denen ein count(*) den Wert 0 ergeben
würde... d.h. es wendet die Intervalle auf die Daten an, und
schaut nicht welche Daten auf alle Intervalle zwischen Start und
Stop... deswegen hatte ich das Beispiel so gewählt , daß auch Zeilen
entstehen, wo Intervalle mit 0 Einträgen vorkommen...

Da ich nicht wüßte, wie man einen Select quasi als Schleife miß-/oder
gebrauchen könnte, wußte ich mir jetzt erst mal nur mit einer
weiteren Tabelle zu helfen, die nix weiter als nur IDs in
aufsteigender Reihenfolge enthält, mit deren Hilfe ich die Intervall-
grenzen erzeuge. Die Anzahl der Zeilen in dieser Hilfstabelle muß
mind. die Anzahl der gewünschten Ergebnisse sein. Mit Hilfe eines
Joins komme ich auf mein gewünschtes Ergebnis. Interessanterweise
bekomme ich als count nie 0, sondern immer 1, daher mein Test
auf NULL auf eine beliebige Datenspalte des Tabelle.
Das ganze funktioniert dann so:

nums ist die Hilfstabelle, die nur eine Spalte 'id' mit den Werten
1 bis 400 enthält (ich brauche immer nur max. 400 Werte..)

SELECT IF(isNull(test.data1),0,count(*)) AS anzahl FROM nums
 LEFT JOIN test ON
  test.ts BETWEEN _S_ AND _E_ AND
  test.ts>=(nums.id-1)*_I_ AND
  test.ts<(nums.id)*_I_
  GROUP BY nums.id

Falls da jemand einen Denkfehler sieht... bitte melden!

Danke an Euch, insbes. Ilja für das Auslegen der richtigen Spur.

yves

p.s.
RDBMS ist mysql 4.1 unter linux