Datenbankabfrage MySQL höchsten Wert aus Spalte

Dimenson

Erfahrenes Mitglied
Moin,

mal wieder stehe ich wie ein Ochse vorm Berg.

Ich habe eine Tabelle:
  • id
  • user_id
  • auktion_id
  • gebot

die enhält mehrere Datensätze:
id user_id auktion_id gebot
-------------------------------------------------------------------------
1 1 2 100
2 2 2 200
3 1 2 300
4 2 2 400
5 1 5 100
6 2 5 200
7 1 5 300

Jetzt möchte gerne als user_id 1 eine Liste dargestellt bekommen wo ich momentan der Höchstbieter bin. Jetzt bin ich gerade momentan am rotieren wie ich meine SQL Abfrage gestalte.
Habt ihr mir da vllt einen Tipp ?

Ich könnte natürlich jeden einzelnen Datensatz mit WHERE user_id 1 ist abfragen und gegen kontrollieren mit einer weiteren SQL Anfrage ob ich wirklich der Höchstbietende der Auktion bin. Aber gibt es eine Möglichkeit mit nur einer SQL Anfrage das rauszufinden ? Bestimmt, aber da ich mich noch wirklich mit komplexere Anfragen in MySQL auskenne, habt ihr mir vllt einen Rat.

Danke
 
Auf die Schnelle und ungetestet
SQL:
SELECT
	max_per_au.auktion_id,
	max_per_au.au_max AS gebot
FROM
	(
		SELECT
			auktion_id,
			MAX(gebot) AS au_max
		FROM
			gebot
		GROUP BY
			auktion_id
	) AS max_per_au
	INNER JOIN (
		SELECT
			auktion_id,
			MAX(gebot) AS my_max
		FROM
			gebote
		WHERE
			-- Hier deine User-ID einfügen
			user_id = 123
		GROUP BY
			auktion_id
	) AS max_for_me
		ON max_per_au.auktion_id = max_for_me.auktion_id
		AND max_per_au.au_max = max_for_me.my_max
 
Zuletzt bearbeitet von einem Moderator:
Ich weiß nicht ob die Version vom Vorgänger funktioniert, habe aber hier eine kürzere getestete Variante:

SQL:
SELECT 
	u.user_id,
	u.auktion_id,
	u.gebot
FROM 
	gebote u,
	gebote alle
WHERE
	u.user_id = 1 AND
    alle.auktion_id = u.auktion_id
GROUP BY	
	u.auktion_id
HAVING
	u.gebot >= MAX(alle.gebot)

grüße
 
Zuletzt bearbeitet von einem Moderator:
Also das scheint gut zu funktionieren. Danke Yaslaw und Respekt weil ungetestet und es funktioniert ^^.

Hier könnt ihr mal ein bißchen schmunzeln mit was ich gerade eben noch ein bißchen getestet hatte:
SQL:
SELECT * FROM 
   auktionshaus_gebote 
WHERE 
   user_id='".$userinfo."' AND 
   user_id=(SELECT 
                         user_id 
                   FROM 
                         auktionshaus_gebote 
                   ORDER BY ABS(preis) DESC LIMIT 1)

Danke :)
 
Zuletzt bearbeitet:
@holzmensch.
Mach Sinn. Aber im HAVING sollte von u.gebot auch das MAX() genommen werdena usser du willst danach gruppieren. (Es kann ja sein, dass ein User mehrere Gebote abgegeben hat.
 
@Yaslaw und holzmensch : Welche Variante ist denn sinnvoller? Und ob ich nun ein paar Zeilen spare oder nicht, spielt keine Rolle. Mir kommt es eher auf die Performance an.

Ich glaube ich habe beide Varianten begriffen,
@holzmensch kann es dennoch sein das bei deiner Variante hier:
SQL:
FROM 
    gebote USER,
    gebote alle

nach gebote ein "AS" fehlt oder muss das gar nicht angegeben werden ?

Danke

Es soll nur das Maximal Gebot abgefragt werden.
@holzmensch.
Mach Sinn. Aber im HAVING sollte von u.gebot auch das MAX() genommen werdena usser du willst danach gruppieren. (Es kann ja sein, dass ein User mehrere Gebote abgegeben hat.
 
@holzmensch.
Mach Sinn. Aber im HAVING sollte von u.gebot auch das MAX() genommen werdena usser du willst danach gruppieren. (Es kann ja sein, dass ein User mehrere Gebote abgegeben hat.

Klar, wenn man mehrere Angebote eingeben kann und alle gespeichert werden, dann sollte man MAX() in HAVING hinzufügen und auch im SELECT. Wollte aber dem Author nciht die ganze Arbeit abnehmen! ;)

PS: Hier dann die Version mit dem MAX für multiple Gebote
SQL:
SELECT 
    u.user_id,
    u.auktion_id,
    MAX(u.gebot) as user_max_gebot
FROM 
    gebote u,
    gebote alle
WHERE
    u.user_id = 1 AND
    alle.auktion_id = u.auktion_id
GROUP BY    
    u.auktion_id
HAVING
    MAX(u.gebot) = MAX(alle.gebot)

Keine Ahnung was performanter ist, musst mal testen, falls du echt viele Abfragen hast. Aus der Anzahl der Zeilen kann man leider nicht auf die Performance schließen, aber viel werden sich die Varianten da nicht nehmen.
 
Zuletzt bearbeitet von einem Moderator:
Das befürchte allerdings auch fast ;)

Hm, jetzt habe ich doch nochmal ne kurze Frage.

Wie zähle ich nun die gesamten Gebote einer Auktion.
Das habe ich nun bei mir jetzt mal getestet:
SQL:
SELECT 
	u.user_id, 
	u.auktionshaus_id, 
	auktionshaus.domain, 
	auktionshaus.datum_ende, 
	MAX(u.preis) AS user_max_gebot 
FROM 
	auktionshaus_gebote u, 
	auktionshaus_gebote alle 
JOIN 
	auktionshaus 
ON 
	auktionshaus.id=alle.auktionshaus_id 
WHERE 
	u.user_id = '44' 
AND 
	alle.auktionshaus_id = u.auktionshaus_id 
AND 
	auktionshaus.datum_ende > '1354038856' 
GROUP BY 
	u.auktionshaus_id 
HAVING MAX(u.preis) = MAX(alle.preis)

Leider hat mein Test:
SQL:
SELECT 
	u.user_id, 
	u.auktionshaus_id, 
	auktionshaus.domain, 
	auktionshaus.datum_ende, 
	MAX(u.preis) AS user_max_gebot,
        u.count(*) AS gebote
FROM 
	auktionshaus_gebote u, 
	auktionshaus_gebote alle 
JOIN 
	auktionshaus 
ON 
	auktionshaus.id=alle.auktionshaus_id 
WHERE 
	u.user_id = '44' 
AND 
	alle.auktionshaus_id = u.auktionshaus_id 
AND 
	auktionshaus.datum_ende > '1354038856' 
GROUP BY 
	u.auktionshaus_id 
HAVING MAX(u.preis) = MAX(alle.preis)

nicht funktioniert.
 
joine das ganze wie ich es schon gemacht habe - übersichtshalber!
Funktioniert der Spaß ohne dein aktionshaus join? Was gibt es für eine Fehlermeldung?
 
Zurück