evilmoe
Goto Top

MYSQL Fehler (Invalid use of group function)

Hi

ich habe gerade folgendes Problem mit einer SQL Abfrage. Ich bekomme als Fehler: Invalid use of group function
"SELECT * FROM server, images WHERE   
server.space_free - SUM(images.fsize_image+images.fsize_thumb) > '%s'   
AND 
server.max_fsize > '%s'   
GROUP BY images.server
ORDER BY SUM(images.traffic) 
ASC LIMIT %d, %d;"  

Die Abfrage soll mir sozusagen die Serverliste ausgeben nach dem Traffic der jeweiligen Server sortiert. Das Problem liegt anscheinen bei dem GROUP und ORDER Befehl. Es soll nach dem Traffic sortiert werden aber nur die zusammen addieren wo der Server auch gleich ist (images.server).

Content-Key: 85898

Url: https://administrator.de/contentid/85898

Printed on: April 23, 2024 at 13:04 o'clock

Member: Biber
Biber Apr 19, 2008 at 21:27:07 (UTC)
Goto Top
Moin EvilMoe,

es liegt in der Natur der GROUP BY-Abfrage, dass es so nicht geht.
Platt gesagt müssen
  • zwingend in der unteren GROUP-BY-Clause alle Feldnamen erwähnt sein, die oben nach der SELECT-Anweisung als Spaltennamen OHNE weitere Aggregatsfunktion auftauchen.
  • umgekehrt alle Felder des Resultsets, die nicht in GROUP-BY-Clause erwähnt sind, mit einer Aggregatsfunktion (SUM, AVG, FIRST, MAX,...) ummantelt sein

Ein "SELECT * .....FROM What, Ever ...Group BY " geht also nicht... schon weil kein "SELECT *" erlaubt ist.
Besser so:
"SELECT images.server, SUM(images.traffic)   
FROM server, images
 WHERE 
server.space_free - SUM(images.fsize_image+images.fsize_thumb) > '%s'   
AND 
server.max_fsize > '%s'   
GROUP BY images.server
ORDER BY SUM(images.traffic) ASC 
LIMIT %d, %d;"  
Grüße
Biber
Member: EvilMoe
EvilMoe Apr 19, 2008 at 21:34:00 (UTC)
Goto Top
Mittlerweile kam ich auch auf eine Lösung, wurde noch etwas umfangreicher aber funktioniert wunderbar und ich werde mir deine Ratschläge mal zur Brust nehmen.

Neue SQL:
SELECT server.id as id, server.space as space, ftp_host, ftp_name, ftp_pass, path,  SUM(images.traffic) as traffic
FROM images, server 
WHERE server.id = images.server AND server.max_fsize > '%d'   
GROUP BY server.id 
HAVING space - SUM(images.fsize_image+images.fsize_thumb) > '%d'  
ORDER BY traffic LIMIT %d, %d