SQL Datenbankabfrage nach Datum und MAX-Wert

andreas002

Newbie
Registriert
Okt. 2015
Beiträge
6
Hallo,
ich habe ein Problem bei der Datenbankabfrage und hoffe, dass mir hier einer der "Datenbankexperten" weiterhelfen kann ...

ich bin am Verzweifeln und bitte um Hilfe ...

ich möchte die Suche in der Spalte "dt" (Datumsformat YYYY-MM-DD HH:ii:ss) auf einen bestimmten Tag begrenzen und gleichzeitig in der Spalte "t2" den max. Wert der Temperatur zur Anzeige bringen.

So liest er mir den max-Wert aus t2 aus ...

PHP:
$q_data_t2max = mysql_query("SELECT * FROM arduino_webklima WHERE t2 = ( SELECT max(t2) FROM arduino_webklima)") or die(mysql_error());

So zeigt er mir den letzten Eintrag vom gesuchten Datum (144 Datensätze) richtig an ...

PHP:
$q_data_t2max = mysql_query("SELECT * FROM arduino_webklima WHERE DATE(dt) = '2015-10-07' [B]OR[/B] t2 = ( SELECT max(t2) FROM arduino_webklima)") or die(mysql_error());

Wenn ich nun aber das OR durch ein AND ersetze, sagt er mir ... das er keine Daten in der DB finden kann. Es kommt auch keine externe Fehlermeldung! Die 144 Datensätze von diesem Tag sind aber in der DB!

Was mache ich falsch oder wie könnte ich die Anfrage anders schreiben?

Zusammenfassung:

1. Daten aus der Spalte "dt" nach einem bestimmten Datum in DB ermitteln
2. aus der Spalte "t2" den MAX-Wert (Temperatur z.B. 20.14) ermitteln

... kann mir bitte jemand weiterhelfen sitze nun schon 2 Tage daran und komme einfach nicht weiter.

Gruss
Andreas

VIELEN DANK IM VORAUS! ;-)
 
Zuletzt bearbeitet von einem Moderator: (ein paar überflüssige ! und ? entsorgt)
AW: Datenbankabfrage

Code:
SELECT *, max(t2) FROM arduino_webklima WHERE DATE(dt) = '2015-10-07';
 
Zuletzt bearbeitet:
AW: Datenbankabfrage

Hallo,
danke fuer die Hilfe und den Tip. Leider funktioniert es nur soweit, dass er mir nun das richtige Datum ausgibt, aber jeweils nur den letzten Datensatz als MAX-Wert anzeigt. Das ist natuerlich nicht richtig, da der MAX-Wert (Temp.) zwischen 00:00 und 23:59 liegt!
er liest also nicht den MAX-Wert aus der DB!

Gibt es noch eine andere Lösung?

MfG
Andreas
Ergänzung ()

Hi

Nachtrag .... es macht keinen Unterschied ob "max(t2)" oder "min(2)" angewendet wird, es wird einfach ignoriert!
Es wird bei beiden der letzte Datensatz von diesem betreffenden Tag ausgegeben ;-(

MfG
 
Das Problem wird sein, dass an diesem Tag nicht die Höchsttemperatur seit Aufzeichnung erreicht wurde (SELECT max(t2) FROM arduino_webklima).
Wenn du die Höchsttemperatur von diesem einen Tag haben willst, musst hier du auch entsprechend eingrenzen.
 
Hi Darlis,
danke, der Hinweis ist richtig, die höchste Temp. ist natuerlich nicht an diesem Tag in der DB!
Meine Frage ist nun wie kann ich das so eingrenzen, dass er nur von diesem einen Tag den MAX-Wert ermittelt?

So funktioniert es jedenfalls auch nicht ...

$q_data_t2max = mysql_query("SELECT * FROM arduino_webklima WHERE t2 = ( SELECT max(t2) AND dt = '2015-10-09' FROM arduino_webklima)") or die(mysql_error());

Da bekomme ich als Ergebnis: 2015-10-10 20:10:01 --- 0.0
was auch nicht stimmt. Das Datum hat auch keinen Einfluss auf die Ausgabe!
Es bleibt immer der 2015-10-10 !!! ;-(

MfG
 
Zuletzt bearbeitet: (ein paar überflüssige ? entsorgt)
Probier es mal so:

Code:
SELECT	 max(t2)
FROM
(SELECT t2 FROM arduino_webklima WHERE DATE (dt) = '2015-10-07')
 
Ich will dir jetzt nicht die Lösung schreiben aber vielleicht kommst du ja von alleine drauf.
Die Bedingung ist (Tag X) UND (Maximalwert am Tag X).
Dein Query in #1 ist ja schon fast richtig, es fehlt nur eine Bedingung.

Eine Alternative wäre übrigens mit ORDER BY und LIMIT.
 
Hallo HenMac10,
danke fuer den Tip und die Hilfe bei der Lösung ... als Fehlermeldung kommt ...

"Every derived table must have its own alias"

Das verstehe ich auch ;-)

Trotzdem vielen Dank!

MfG
Ergänzung ()

Hi Darlis,
das was Du schreibst ist ja richtig und mir auch soweit klar.
Stehe im Moment ehrlich gesagt auf dem Schlauch - sorry!

Mein Gedanke war ja dieser ...

$q_data_t2max = mysql_query("SELECT * FROM arduino_webklima WHERE DATE(dt) = '2015-10-07' AND t2 = ( SELECT max(t2) FROM arduino_webklima) LIMIT 144;") or die(mysql_error());

Aus meiner Denkweise ist ja die Bedingung erfuellt ...

1. suche den den Tag X
AND
2. suche den MAX-Wert
und
3. begrenze alles auf die 144 Messwerte von diesem Tag X .

... aber scheinbar nicht fuer die MySQL-DB!

Ich ging davon aus, dass MySQL dann nur diesen begrenzten Abschnitt fuer die Ermittlung des MAX-Wertes nutzt. Das war aber ein Irrtum!

Das Ergebnis welches er mir liefert ist einfach falsch bzw. funktioniert so nicht ...
2015-10-10 20:10:01 --- 0.0

Sorry ich habe im Moment keinen anderen Plan mehr ... :-( auch wenn du mich verprügelt, ich komme zu keiner anderen Lösung.

Komme gerade von Nachtschicht ... muss nun erst mal darueber schlafen!

MfG
 
Zuletzt bearbeitet:
Variante 1:
Code:
    SELECT	 max(t2)
    FROM
    (SELECT t2 FROM arduino_webklima WHERE DATE (dt) = '2015-10-07')tbl

-> da fehlt nur der Alias hinter dem Subselect, kann sein dass vor das tbl noch ein Leerzeichen muss.

Variante 2 (deine Variante):

Code:
$q_data_t2max = mysql_query("SELECT * FROM arduino_webklima WHERE DATE(dt) = '2015-10-07' AND t2 = ( SELECT max(t2) FROM arduino_webklima WHERE DATE(dt) = '2015-10-07')  LIMIT 1;") or die(mysql_error());

Da fehlt im Selektieren des Maximums die Einschränkung des Datums, willst ja nur das Maximum für den Tag. Da bekommst du natürlich durch das SELECT * nicht nur das Maximum sondern auch noch das Datum dazu... Zur Sicherheit würde ich da vielleicht noch ein Limit 1 dahinterhängen, falls es mehr als eine Tageszeit gibt, zu der das Maximum aufgetreten ist, je nach Anforderung kann man das aber dann auch weglassen.
Ergänzung ()

andreas002 schrieb:
Ergänzung ()

Hi

Nachtrag .... es macht keinen Unterschied ob "max(t2)" oder "min(2)" angewendet wird, es wird einfach ignoriert!
Es wird bei beiden der letzte Datensatz von diesem betreffenden Tag ausgegeben ;-(

MfG

Und da fehlt ein wenig SQL Grundwissen:
SELECT max(X), Y FROM Z fliegt dir unter 'anständigen Datenbanken' um die Ohren, alldiweil max eine Aggregatsfunktion ist. Alles was im SELECT nicht in einer Aggregatsfunktion steht, gehört eigentlich immer in ein Group by. Beispiel:

X Y
1 2
3 4
2 1
4 4

Unter Mysql läuft es so, dass er dann das Maximum raussucht und beim Rest einen zufälligen Datensatz rauswirft, ausser du machst ein SELECT max(X), Y FROM Z GROUP BY Y, dann wirf er dir je unterschiedlichem Y Wert das maximale X raus, also hier würde er ausgeben 1,2; 2,1; 4,4 und das 3,4 wegignorieren weil da das X nicht maximal ist für Y = 4, gibts ja schonmal mit 4,4. Das Verhalten von MySQL an der Stelle ist einfach leicht fragwürdig, es ist nicht komplett verkehrt aber man muss es wissen und entsprechend behandeln.

Bei deiner Variante müsste dann also nach dem Datum Gruppiert werden, wobei ich aber nicht weiß ob ein date() überhaupt ins Group By darf, kann sein dass man das erst über ein Subselect behandeln muss. Die beiden Varianten oben dürften aber laufen.
 
Zuletzt bearbeitet von einem Moderator:
Kann MySQL denn keine Window-Funktionen?

Nach Datum gruppieren und dann innerhalb der Gruppe den MAX-Wert ermitteln, ggf. noch nach Datum einschränken.
 
Zuletzt bearbeitet:
Hallo mambokurt,
zu erst einmal vielen Dank auch fuer Deine Hilfe.
Ja, so wie Du es nun in der Variante 2 gemacht hast ist es auch fuer mich logisch und es funktioniert!!!

Als "Hobbyprogrammierer" muss man halt nur zum richtigen Zeitpunkt auf alle Details kommen. Hatte bis dato wirklich keinen Plan mehr und unzählige Varianten getestet. Ich kann Dir aber versichern das es mir sehr geholfen hat und ich wirklich was neues dazu gelernt habe - also nicht nur kopieren und vergessen ;-)

An dieser Stelle auch vielen Dank an ALLE fuer das Lesen des Beitrages, die geopferte Zeit und die zahlreichen Tipps und Informationen. Einen besonderen Danke auch an die Forenbetreiber ohne die eine so schnelle Lösung nicht möglich gewesen wäre. Deshalb auch 5 Sterne und meine Empfehlung, von mir, fuer dieses Forum!

MfG
Andreas
 
Zurück
Oben