Anwendung der min()-Funktion

Hallo zusammen,

ich möchte gerne über einen Join einen Datensatz finden, bei dem der geringste Preis gilt.
Die SQL-Query sieht derzeit wie folgt aus und findet 3 Datensätze:

SELECT 
  image.name, 
  object.name, 
  object.city, 
  region.region, 
  region.description, 
  charge.charge, 
  charge.unit, 
  image.description, 
  object.id
FROM 
  public.image, 
  public.object, 
  public.region, 
  public.charge
WHERE 
  object.region_id = region.id AND
  object.id = image.object_id AND
  object.id = charge.object_id AND
  object.id = 1 AND 
  image.gallery = 1;

Die min()-Funktion möchte ich auf das Attribut charge.charge anwenden. Wenn ich nun allerdings die Quert wie folgt verändere, erhalte ich einen Fehler:

SELECT 
  image.name, 
  object.name, 
  object.city, 
  region.region, 
  region.description, 
  min (charge.charge), 
  charge.unit, 
  image.description, 
  object.id
FROM 
  public.image, 
  public.object, 
  public.region, 
  public.charge
WHERE 
  object.region_id = region.id AND
  object.id = image.object_id AND
  object.id = charge.object_id AND
  object.id = 1 AND 
  image.gallery = 1;



ERROR: column "image.name" must appear in the GROUP BY clause or be used in an aggregate function
SQL state: 42803
Character: 11

Könnt ihr mir bitte auf die Sprünge helfen, wo mein Denkfehler liegt. Danke.

Um eine Aggregatsfunktion wie min() verwenden zu können, musst du deine Abfrage gruppieren. Also ein GROUP BY mit rein bringen. Vereinfacht gesagt musst du nach allen Werten vor der Funktion gruppieren. Näheres sagt dir die Doku.

cu tb.

Sehr cool! Folgende Lösung ist dabei entstanden:

SELECT 
  min(charge.charge) as charge, 
  image.name, 
  object.name, 
  object.city, 
  region.region, 
  region.description, 
  charge.unit, 
  image.description, 
  object.id
FROM 
  public.image, 
  public.object, 
  public.region, 
  public.charge
WHERE 
  object.region_id = region.id AND
  object.id = image.object_id AND
  object.id = charge.object_id AND
  object.id = 1 AND 
  image.gallery = 1
GROUP BY
  image.name,
  object.name,
  object.city, 
  region.region, 
  region.description, 
  charge.unit, 
  image.description, 
  object.id;

Ich kann zwar den Grund dafür nicht erkennen, manche Dinge muss man jedoch vllt. einfach hinnehmen…

Nochmal vielen Dank für die Unterstützung.

Naja das Minimum muss er ja über eine bestimmte Gruppe bilden. Das macht group by. In deinem Fall nimmst du jetzt alle Fehlder als Gruppe und davon das Minimum.

cu tb.

Okay, macht Sinn. Danke für die Erklärung! :slight_smile: