Veröffentlicht 23. Oktober 200618 j Hallo, ich habe ein MySQL-Problem mit GROUP BY, und zwar habe ich in der Abfrage ein COUNT(IF()) drin, das eine Größer/Kleiner - Bedingung in Verbindung mit einer Addition abprüfen soll. Es funktioniert sonst alles bis auf dieses COUNT; ich bekomme da immer "Invalid use of GROUP BY", wenn dieser Abschnitt ausgeführt wird. Habe ich irgendwo einen Denkfehler oder warum funktioniert die Abfrage nicht? Die Abfrage lautet folgendermaßen: SELECT CONCAT( Spalte1, '-', Spalte2 ), COUNT( CONCAT( Spalte3, '-', Spalte4 ) ), [blabla] [hier funktionierts] COUNT(IF( (SEC_TO_TIME( (UNIX_TIMESTAMP( CONCAT( Datum2, ' ', Zeit2 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum1, ' ', Zeit1 ) ) ) ) ) > (SEC_TO_TIME( (UNIX_TIMESTAMP( CONCAT( Datum4, ' ', Zeit4 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum3, ' ', Zeit3 ) ) ) ) ),1,NULL) ) AS NeuerWert1, [fertig funktionierend] [hier ist der Problembereich] COUNT(IF( (SEC_TO_TIME( (UNIX_TIMESTAMP( CONCAT( Datum2, ' ', Zeit2 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum1, ' ', Zeit1 ) ) ) )) > (SEC_TO_TIME( AVG( (UNIX_TIMESTAMP( CONCAT( Datum2, ' ', Zeit2 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum1, ' ', Zeit1 ) ) ) ) + STD( (UNIX_TIMESTAMP( CONCAT( Datum2, ' ', Zeit2 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum1, ' ', Zeit1 ) ) ) ) )),1,NULL) ) AS NeuerWert2, [Ende Problem] FROM tbl_bla WHERE Datum2 BETWEEN '2006-01-01' AND '2006-09-30' GROUP BY Spalte1, NeuerWert2 ORDER BY Spalte1, NeuerWert2 Danke und Gruß -etops-
23. Oktober 200618 j GROUP BY Spalte1, NeuerWert2 Probier mal alle vorhandenen Spalten im Select auch in deine Gruop By Klausel aufzunehmen. Da liegt oft das Problem.
23. Oktober 200618 j Funktioniert dein Problembereich, wenn du ihn ohne den ganzen Rest ausführst? EDIT: Auch mal ohne Group und Count.
23. Oktober 200618 j Nein, auch da funktioniert die Abfrage nicht (wieder "Invalid use of GROUP-function") Es kann ja kaum daran liegen, daß ich innerhalb von COUNT noch eine Addition durchführe?!
23. Oktober 200618 j die Spalte "CONCAT( Spalte1, '-', Spalte2 )" taucht in deinem Group by nicht auf, dafür gruppierst du nach einer "Spalte1", die in deinem select nicht auftaucht klappt es mit [...] GROUP BY CONCAT( Spalte1, '-', Spalte2 ), NeuerWert2 [...] ?
23. Oktober 200618 j klappt es mit [...] GROUP BY CONCAT( Spalte1, '-', Spalte2 ), NeuerWert2 [...] ? es muss damit klappen. concat erzeugt eine neue spalte, klare sache. eleganter wäre oben CONCAT(****) as irgend-was und dann unten group by irgend-was
24. Oktober 200618 j @baba007 Ich hab das CONCAT benannt (hab ich hier vergessen darzustellen, sorry) und nach dieser Spalte wird auch gruppiert. Und trotzdem geht es leider nicht.
24. Oktober 200618 j Was willst du mit diesem SQL überhaupt erreichen? Ich hab das mal nachgebaut. SELECT SEC_TO_TIME(UNIX_TIMESTAMP( CONCAT( Datum2, ' ', Zeit2 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum1, ' ', Zeit1 ) ) ) > SEC_TO_TIME( AVG( (UNIX_TIMESTAMP( CONCAT( Datum2, ' ', Zeit2 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum1, ' ', Zeit1 ) ) ) ) + STD( (UNIX_TIMESTAMP( CONCAT( Datum2, ' ', Zeit2 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum1, ' ', Zeit1 ) ) ) ) ) FROM `test` t ; liefert z.B. immer nur 1 Wert, weil AVG ja z.B. schon eine Zusammenfassung der Ergebnisse ist. Das hier SELECT IF( SEC_TO_TIME(UNIX_TIMESTAMP( CONCAT( Datum2, ' ', Zeit2 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum1, ' ', Zeit1 ) ) ) > SEC_TO_TIME( AVG( (UNIX_TIMESTAMP( CONCAT( Datum2, ' ', Zeit2 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum1, ' ', Zeit1 ) ) ) ) + STD( (UNIX_TIMESTAMP( CONCAT( Datum2, ' ', Zeit2 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum1, ' ', Zeit1 ) ) ) ) ), 1, NULL) S1 FROM `test` geht auch. liefert eben 1 oder NULL (wenn man das größer als kleiner schreibt). Aber liefert auch nur 1 Ergebnis. Was willst du dann noch zählen? Ach ja, der Count um das letzte geht nicht mehr. Der dürfte bei dir wohl das Problem sein. Frage ist nur, was tust du da überhaupt?
24. Oktober 200618 j Was ich tun möchte: ich möchte zählen, wieviele Ereignisse es gab, deren zeitliche Länge größer war als die durchschnittliche Länge aller Ereignisse zuzüglich einer Standardabweichung.
24. Oktober 200618 j Weiss net obs hilft, aber Group By kann net mit ALiasen aus dem Select klarkommen. Versuch also da nochmal den gleichen KRams wie im Select zu benutzen... evtl. klappt das ja
24. Oktober 200618 j Was ich tun möchte: ... Mach das doch mit mehreren Abfragen oder mit Subselects. Weil das SQL erfüllt wohl so wie es geschrieben wurde diesen Zweck nicht EDIT: Kann auch so gar nicht gehen, weil du im selben SQL die Anzahl der Ergebnisse willst und den Durchschnitt errechnen... Je nach Version und Antwortzeit etc. würd ich das als Subselect machen oder die Durchschnittszeit vorher berechnen.
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.