Sqlabfrage !

Hallo an alle,

hier ist mal wieder der Dummiiiii !

ich benötige wieder eure Hilfe bei der Abfrage einer Tabelle.
in einer Tabelle stehen die Monatsbeiträge:

Id - Nutzer - Datum - Wert
1 - 1 - 2002.01.01 - 15
2 - 2 - 2002.01.01 - 15

99 - 2 - 2009.10.01 - NULL

106 - 1 - 2009.11.01 -10

wenn ich nun die zu zahlenden Beiträge für Nutzer 1 und den Zeitraum 01.01.2009 - 31.12.2009 abrufen möchte, so soll er alle Datensätze durchsuchen und aus Zeile ID 2 mir für Januar - September 15 liefern und für Oktober - Dezember NULL (Id 99) als Array ausgeben.
Bei Nutzer 1 müsste dann ein Array(15;15;15;15;15;15;15;15;15;15;10;10)

Leider weiß ich nicht wie ich in einem solchem Fall die Abfrage formulieren soll.

Erst einmal Danke
Stefan Behrendt

Hallo Stefan,

Du hast mich jetzt verworren: In den Beispielsdatensatz tauchen Werte auf die zeitlich gesehen nicht relevant sind, aber Du referenzierst mit Zeilen-ID 2 darauf. Oder meinst Du statt Zeilen-ID etwa den Nutzer 2?
Was Du benötigst ist ein Gruppierung über das Datum (nicht tagesweise sondern monatsweise). Und hier fehlt zur weiteren Detaillierung Deine Angabe über das verwendete Datenbanksystem.
Desweiteren gibt SQL normalerweise keine Array heraus und auf keinen Fall Informationen über nicht vorhandene Datensätze. Wenn Du die Monatsinformationen jedoch angezeigt haben willst, must Du eine Tabelle mit den Monatsnamen mittels LEFT bzw RIGHT-JOIN beimischen. Solltest Du Array eine Zeile pro Nutzer meinen, suche bitte im Archiv nach dem Thema transponieren.

MfG Georg V.

Hallo Georg,

ich wollte dich nicht verwirren. Sorry !
Ich schreibe in meiner Datenbank: Id für Zeilennummer Nutzer_ID ist die Nummer des Mitgliedes ich z.B. 1 das Datum beziet sich auf den Tag ab wo ein besímmter Beitrag gilt und Wert für den Beitrag also würde ich alle mich betreffenden daten ausgeben so hätte ich

ID - Nutzer - Datum - Wert (Info)
1 - 1 - 2002.01.01 - 15 (Eintritt in den Verein mit 15 € Beitrag)

106 - 1 - 2009.11.01 - 10 (Der beitrag wird auf 10 € gesenkt)

187 - 1 - 2010.01.01 - NULL (Ich bin aus dem Verein Ausgetreten)
200 - 1 - 2010.06.01 - 10 (nun bin ich wieder dabei)

Somit gilt vom 01.01.2002 bis 31.10.2009 der Beitrag von 15 €
ab 01.11.2009 bis 31.12.2009 ein Beitrag von 10 € danach garnichts (NULL) und ab 01.06.2010 müßte ich dann wieder 10 € Bezahlen.
ich hoffe ich habe das ganze nun ein wenig verständlicher erklärt um verwirrungen zu unterbinden

Cu Stefan

Hallo Stefan,

den Aufbau der Datenbank hatte ich schon verstanden, nur wird dieses Datenmodell normalerweise verwendet, wenn man jeden Zahlungseingang protokolliert. Für Einträge an den Zeitpunkten, an den sich Änderungen ergeben wählt man normalerweise ein Datenstruktur mit zwei Datumsattributen (Datum_von und Datum_bis). Das erspart einem die Suche nach Nachfolgedatumssätze (Self-Join der Tabelle).

Aber zur weiteren Hilfe hast Du die Fragen nach dem Datenbank-System nicht beantwortet.

MfG Georg V.

Oh Sorry !

MySQL Ver. 5.0.67 mittels PHP 5

Cu Stefan

Moin Stefan Behrendt,

hier ist mal wieder der Dummiiiii !

ich benötige wieder eure Hilfe bei der Abfrage einer Tabelle.
in einer Tabelle stehen die Monatsbeiträge:

Id - Nutzer - Datum - Wert
1 - 1 - 2002.01.01 - 15
2 - 2 - 2002.01.01 - 15

99 - 2 - 2009.10.01 - NULL

106 - 1 - 2009.11.01 -10

Auweia!
Datum ist nicht ISO (2009-01-01) und Spaltennamen mit Großbuchstaben solltest du dir in Zukunft auch verkneifen. Zahlen ebenso und reservierte Begriffe (z. B. alter).
Soviel mal zum Grundsätzlichen.

wenn ich nun die zu zahlenden Beiträge für Nutzer 1 und den
Zeitraum 01.01.2009 - 31.12.2009 abrufen möchte, so soll er
alle Datensätze durchsuchen und aus Zeile ID 2 mir für Januar

  • September 15 liefern und für Oktober - Dezember NULL (Id 99)
    als Array ausgeben.
    Bei Nutzer 1 müsste dann ein
    Array(15;15;15;15;15;15;15;15;15;15;10;10)
    Leider weiß ich nicht wie ich in einem solchem Fall die
    Abfrage formulieren soll.

SELECT wert
FROM meinetabelle
WHERE datum BETWEEN ‚2009-01-01‘ AND ‚2009-12-31‘ AND nutzer = ‚2‘
ORDER BY datum

Ich befürchte nur, daß das Statement wegen deines nicht ISO-konformen Datums eine Fehlermeldung produziert.
In dem Fall musst du an der DB nacharbeiten.

Erst einmal Danke
Stefan Behrendt

Bitte.
widecrypt

Hallo widecrypt !

Sorry aber das Datum ist als Date mit (-) gespeichert ich empfand es nur günstiger mit Punkt zu schreiben da der Rest meiner Auflistung durch Bindestrich getrennt ist.

die Spaltenköpfe werden klein geschrieben ??? aha und warum ???

Auf jeden Fall erstmal danke !!!

Nur leider kann ich mit betwenn nur Werte verwenden welche in der Tabelle auch vorhanden sind.
So ich für Nutzer 1 alle Buchungen für 2008 haben möchte gibt es keinen Datensatz der auch nur im entferntesten eine 2008 enthält. Da der Beitrag 2002 bei 15 € Lag und erst 2009 auf 0 gesetzt wurde. aber ich werde es mal mit dem einfügen einer Neuen Spalt versuchen und immer ein gültig von-bis setzen so habe ich wenigstens einen bereich in dem ich suchen kann.

Der Dummiiii bedankt sich und sagt erst mal Tschüß

Cu Stefan

Hallo Stefan,

ist die Abfrage bzw das Datenmodell noch aktuell? Das Statement von widecrypt würde Dir übrigens nur die Änderungen einer Zahlung herausgeben. Und die Datumswerte die Du bei BETWEEN verwendest müssen nicht(!) in den Daten vorkommen, denn

WHERE datum BETWEEN '2009-01-01' AND '2009-12-31'

ist eine kurzschreibweise für

WHERE datum \>= '2009-01-01' 
 AND datum 
MfG Georg V.