# SQL: Zugehöriger Wert zu einem Max Wert



## NBOne (19. Juli 2005)

Hi,

ich habe ein MySQL Problem:

Erstmal mein Query, ich hab mich nicht in der Lage gesehen das so zu beschreiben 

SELECT tabelle1.*, MAX(tabelle2.datetime) AS datum
FROM tabelle1 
LEFT JOIN tabelle2 ON (tabelle2.id=tabelle1.id) 
GROUP BY tabelle1.id

Also, ich hole mir alle Daten aus der tabelle1 und das datetime Feld aus der Tabelle2 welches am neuesten ist. Soweit ist das kein Problem, nun benötige ich jedoch noch das Feld "name" aus tabelle2, und zwar den Wert des Feldes "name" aus dem Datensatz in dem das Feld "datetime" maximal ist.

Hat jemand eine Idee wie ich das bewerkstelligen kann?

Gruß,

NBOne


----------



## Thomas Darimont (19. Juli 2005)

Hallo!


```
mysql> select * from bar;
 +------+------+
 | id   | data |
 +------+------+
 |	0 | A	|
 |	1 | B	|
 |	2 | C	|
 |	3 | D	|
 +------+------+
 4 rows in set (0.00 sec)
```
 

```
mysql> select * from bar order by id desc limit 1;
 +------+------+
 | id   | data |
 +------+------+
 |	3 | D	|
 +------+------+
 1 row in set (0.00 sec)
```
 
 Gruß Tom


----------



## hpvw (20. Juli 2005)

Hi Tom,
ich denke, das ist ein Fall, für das Query, welches Du neulich gepostest hast. Allerdings müßte man das nun auf zwei Tabellen erweitern.

Eine andere Möglichkeit ist dieser beschämende Workaround meinerseits aus Datics Problem vom Mai.

Eine weitere Möglichkeit ist (ab Version 4.1) ein Subquery.

Gruß hpvw


----------



## Thomas Darimont (20. Juli 2005)

Hallo!

 Na dann so:

```
mysql> select a.* from foo a LEFT JOIN foo b on a.id < b.id WHERE b.id is null;
 +------+------+
 | id   | data |
 +------+------+
 |	3 | D	|
 +------+------+
 1 row in set (0.00 sec)
```
 
 Gruß Tom


----------



## Killian (23. August 2005)

Hallo,

auch wenn dieser Thread schon alt ist möchte ich ihn trotzdem "wiederbeleben". Ich habe ein ähnliches Problem nur andersherum:

In meiner MySQL-DB(4.1.12) befinden sich u.a. zwei Tabellen:


auktion mit "a_id", "beschreibung"
gebote mit "id", "a_id"(Auktions-ID),"k_id"(Bieter-ID) und "gebot"

Nun möchte ich bei der Darstellung der Auktionen zu den Angaben aus "auktion" nur den aktuellen Preis aus "gebote" haben - Bei zwei Geboten also den niedrigsten.

Folgende Abfrage zeigt Auktionen doppelt mit dem jeweiligen Preis an, sofern zwei (oder mehr) Gebote abgegeben wurden:


```
SELECT * FROM auktion JOIN gebote ON auktion.a_id=gebote.a_id WHERE ...
```

Leider verstehe ich nicht wo die Antwort von Thomas eine Lösung für zwei Tabellen ist, sonst könnte ich da wenigstens ansetzen. Ich habe es auch schon mit MIN() versucht, das klappt aber überhaupt nicht. Kann mir jemand bei der Lösung helfen?

Gruß

-killian-


----------



## Thomas Darimont (23. August 2005)

Hallo!


> Nun möchte ich bei der Darstellung der Auktionen zu den Angaben aus "auktion" nur den aktuellen Preis aus "gebote" haben - Bei zwei Geboten also den niedrigsten.


    Du meinst doch den höchsten? Oder sind wir hier bei einer Billiglohnauktion?!

    Schau mal hier:

```
mysql> select * from auktion;
    +------+--------------+
    | a_id | beschreibung |
    +------+--------------+
    |	1 | FOO		  |
    |	2 | BAR		  |
    +------+--------------+
    2 rows in set (0.00 sec)
    
  mysql> select * from gebote;
   +------+------+------+---------+
   | id   | a_id | k_id | gebot   |
   +------+------+------+---------+
   |	1 |	1 | 1000 | 2000.00 |
   |	2 |	1 | 1001 | 1500.00 |
   |	3 |	1 | 1002 | 3500.00 |
   |	4 |	1 | 1000 | 5000.00 |
   |	5 |	2 | 1005 | 7000.00 |
   |	6 |	2 | 1002 | 1000.00 |
   +------+------+------+---------+
   6 rows in set (0.00 sec)
    
    //Höchstes Gebot je Auktion
 mysql> select g.*
  	-> from gebote g LEFT JOIN gebote g_
  	-> on g.a_id = g_.a_id and g.gebot < g_.gebot
  	-> WHERE g_.id is null;
  +------+------+------+---------+
  | id   | a_id | k_id | gebot   |
  +------+------+------+---------+
  |	4 |	1 | 1000 | 5000.00 |
  |	5 |	2 | 1005 | 7000.00 |
  +------+------+------+---------+
  2 rows in set (0.00 sec)
   
   //Niedrigstes Gebot je Auktion:
 mysql> select g.*
  	-> from gebote g LEFT JOIN gebote g_
  	-> on g.a_id = g_.a_id and g.gebot > g_.gebot
  	-> WHERE g_.id is null;
  +------+------+------+---------+
  | id   | a_id | k_id | gebot   |
  +------+------+------+---------+
  |	2 |	1 | 1001 | 1500.00 |
  |	6 |	2 | 1002 | 1000.00 |
  +------+------+------+---------+
  2 rows in set (0.00 sec)
 
 //Niedrigstes Gebot zu Auktion 2
 mysql> select g.*
 	-> from gebote g LEFT JOIN gebote g_
 	-> on g.a_id = g_.a_id and g.gebot > g_.gebot
 	-> WHERE g_.id is null and g.a_id =2;
 +------+------+------+---------+
 | id   | a_id | k_id | gebot   |
 +------+------+------+---------+
 |	6 |	2 | 1002 | 1000.00 |
 +------+------+------+---------+
 1 row in set (0.00 sec)
```
 
    Gruß Tom


----------



## Thomas Darimont (23. August 2005)

Hallo!

 //Abfrage korrigiert.

 Gruß Thomas


----------



## Killian (23. August 2005)

Hallo Thomas,

danke für die Antwort. Niedrigpreis ist richtig, ich habe Deine Abfrage aber verstanden und entsprechend geändert.

Um den Bogen zu den Auktionsdaten zu schlagen sieht die Abrage dann so aus (falls jemand anderes das gleiche Problem hat)

```
select g.*, auktion.*
  	-> from gebote g LEFT JOIN gebote g_
  	-> on g.a_id = g_.a_id and g.gebot > g_.gebot
  	-> JOIN auktion on auktion.a_id=g.a_id
        ->WHERE g_.id is null
```
 .

Nochmals Danke,

Gruß

-killian-


----------



## egonegon (7. Juli 2007)

Hallo,

ich suche die SQL-Antwort auf die gleiche Frage, allerdings zu verschärften Bedingungen:


> Welches ist das höchste Gebot je Auktion?



Bedingung: Alle Felder aus _auktion_ und _gebote_ werden ausgegeben.
Bedingung: Jede Auktion wird genau einmal ausgegeben, d.h.:
Auktionen ohne Gebote werden ebenfalls angezeigt, z.B. mit _NULL_-Werten, evtl. mit einem Flag _ohne_Gebot_.
Bei mehreren Geboten wird alleine das zuerst abgegebene ausgegeben.

.
In den Beispieltabellen ist FOOBAR ohne Gebot und auf BAR wurde zweimal mit 7000 geboten, allerdings zu unterschiedlichen Zeiten.

```
mysql> select * from auktion;
    +------+--------------+
    | a_id | beschreibung |
    +------+--------------+
    |	1 | FOO		  |
    |	2 | BAR		  |
    |	3 | FOOBAR	   |
    +------+--------------+
    
 mysql> select * from gebote;
   +------+------+------+---------+------------+
   | id   | a_id | k_id | gebot   | gebot_date |
   +------+------+------+---------+------------+
   |	1 |	1 | 1000 | 2000.00 | 01.01.2007 |
   |	2 |	1 | 1001 | 1500.00 | 01.01.2007 |
   |	3 |	1 | 1002 | 3500.00 | 01.01.2007 |
   |	4 |	1 | 1000 | 5000.00 | 01.01.2007 |
   |	5 |	2 | 1005 | 7000.00 | 01.01.2007 |
   |	6 |	2 | 1002 | 1000.00 | 01.01.2007 |
   |	7 |	2 | 1006 | 7000.00 | 24.12.2007 |
   +------+------+------+---------+------------+
```

Herzlichen Dank für alle Tipps.


----------

