AK: mysql: GROUP BY in Kombination mit ORDER BY

Hallo!

Ich habe 2 (für dieses Problem relevante) Tabellen für eine Art Auktionssystem. Eine enthält alle Gebote zu einer Auktion, die andere enthält die Bieter (dealers).

Ich möchte jetzt eine Liste über die jeweils *niedrigsten Gebote* jedes Bieters. Dabei möchte ich jeden Bieter nur einmal.

Die Query sieht im Moment so aus:

SELECT d.dealer_id, b.bid_value FROM bids b, dealers d WHERE d.dealer_id = b.bid_bidder GROUP BY d.dealer_id ORDER BY b.bid_value

Wenn ich jetzt folgende Daten habe:

1. bid_bidder 1 -> bid_value = 700
1. bid_bidder 2 -> bid_value = 500
2. bid_bidder 1 -> bid_value = 300

Dann gibt mir die Query das jeweils erste Gebot (700 für bid_bidder 1) an und nicht das niedrigste (300). Warum? Eine Anfrage mit "DISTINCT" funktioniert auch nicht, da die bid_values ja jedes mal anders sind.

Momentan umgehe ich das Problem, indem ich das niedrigste Gebot in einer PHP-Schleife nach der Query finde, aber ich hätte gern eine saubere Antwort.

Danke im Vorraus. :)

Anton

  1. Kennzeichne dein Bietfeld mit der Eigenschaft MIN(). Also:

    SELECT d.dealer_id, MIN(b.bid_value) FROM bids b INNER JOIN dealers d ON d.dealer_id = b.bid_bidder GROUP BY d.dealer_id ORDER BY b.bid_value

    Den Join würde ich auch so umsetzen.
    Viele Grüße.

  2. Hello,

    SELECT d.dealer_id, b.bid_value FROM bids b, dealers d WHERE d.dealer_id = b.bid_bidder GROUP BY d.dealer_id ORDER BY b.bid_value

    das ist nur in MySQL gültig...Jedes (in dieser Beziehung) vernünftige DBMS hätte dir das Statement vor die Füße geworfen, weil du eine nicht-gruppiert und nicht-aggregierte Spalte (b.bid_value) selektierst. Du gehst also gerade auf eine Menschenmenge zu, gruppierst die Menschen nach roten und grünen Pullovern und erwartest am Ende eine Aussage machen zu können, wer von denen eine Brille trägt...Merke: SELECT bei GROUP BY nur mit

    • Spalten aus der GROUP BY Klausel
    • Spalten mit SUM, MAX, ...
      Letzteres löst sogar unmittelbar dein Problem, lass dir aus der Gruppe das minimale geben:
      SELECT d.dealer_id, MIN(b.bid_value) AS minium_bid...

    MfG
    Rouven

    --
    -------------------
    Eine Bilanz ist wie der Bikini einer Frau. Sie zeigt fast alles, aber verdeckt das Wesentliche  --  Günter Stotz, Regierungsdirektor des baden-württembergischen Wirtschaftsministeriums