SQL: Zugehöriger Wert zu einem Max Wert

NBOne

Mitglied
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
 
Hallo!

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

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

Gruß Tom
 
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
 
Hallo!

Na dann so:
Code:
 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
 
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:

  1. auktion mit "a_id", "beschreibung"
  2. 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:

Code:
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-
 
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:
Code:
    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
 
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)
Code:
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-
 
Zuletzt bearbeitet:
Hallo,

ich suche die SQL-Antwort auf die gleiche Frage, allerdings zu verschärften Bedingungen:
Welches ist das höchste Gebot je Auktion?
  1. Bedingung: Alle Felder aus auktion und gebote werden ausgegeben.
  2. 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.
Code:
 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.
 

Neue Beiträge

Zurück