• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[mysql] Datensatz mit höchstem Wert eines Feldes liefern

afoeder

New member
Hallo mal wieder,

ich möchte den/diejenige Datensätze abfragen, bei denen ein bestimmtes Feld den selben Wert wie der höchste Wert ebendieses Feldes hat.

also Beispiel:

Hinz 83
Kunz 84
Ebele 82

Hinz hat 84, also soll dieser Datensatz zurückgeliefert werden.

Nun wäre es ja möglich (falls 84 "alter" ist),

SELECT * from tabelle where alter = max(alter)

zu tun.
Ist auch logisch gesehen genau das, was ich brauche.

Ich möchte/muss aber vorher noch GRUPPIEREN, also Beispiel:

Hinz 83 Golf
Kunz 84 Polo
Ebele 82 Polo
Maier 85 Golf
Frieder 82 Golf

Ich möchte also dann die älteste Person aus einer bestimmten GRUPPE haben, im o.g. Beispiel wäre das bei Golf die 85 und bei Polo die 84.

Gedacht hätte ich mir also

SELECT * from tabelle WHERE alter=max(alter) group by automarke

da wirft mir mySQL aber eine Fehlermeldung wegen falscher Anwendung von group.

Immerhin
SELECT * from tabelle group by automarke having alter=max(alter)
wirft keinen Fehler, gibt aber auch keinen gescheiten DAtensatz zurück, da beim GROUPen es ja immer fraglich ist, welcher von den kollabierten Datensätzen denn nun angezeigt wird.


Habt ihr eine Idee hierfür?
Besten Dank und Grüße,

Adrian
 
Warum willst du gruppieren, wenn du einen eindeutigen Datensatz haben möchtest? was soll den passieren wenn zwei Golf Fahrer 85 sind?
 
Hallo afoeder,

vielleicht suchst du eine Query in dieser Art:

Code:
SELECT
	*
FROM
	tabelle t1
WHERE
	t1.age =
	(
		SELECT
			max(age)
		FROM
			tabelle
		WHERE
			automarke = t1.automarke
		GROUP BY
			automarke
	)
 
Hallo "ein schlauer",
ich möchte, um bei bisherigem Beispiel zu bleiben, im Falle von

Hinz 83 Golf
Kunz 84 Polo
Ebele 82 Polo
Maier 85 Golf
Frieder 82 Golf


dann folgendes Ergebnis haben:

84 Polo
85 Golf

also nach Automarke gruppiert und innerhalb derselben Gruppe soll der Datensatz mit MAX(alter) zurückgegeben werden.


Curtains, danke für Deinen Beitrag, an einen sub-select habe ich auch schon gedacht (im Prinzip genau einen solchen), aber sub-selects sind mir... naja... ein wenig unsympatisch :)


Konkret geht's übrigens nicht ums Alter, sondern um eine Versionshistorie, wo mehrere Versionen einer Information einfach als redundante Datensätze vorhanden sind. Und ich möchte immer den Datensatz mit der höchsten Versionsnummer; das GROUPING wäre dann in diesem Falle der (kombinierte) Primärschlüssel, der die Information (nicht den Datensatz) eindeutig identifiziert.

also z.B.


Code:
infoID / version / infotext
3          2          Der Zweite Weltkrieg ging bis 1944.
3          3          Der Zweite Weltkrieg ging bis 1915.
3          4          Der Zweite Weltkrieg ging bis 1945.
5          1          Zurück in die Zukunft ist mit John Cleese.
5          2          Zurück in die Zukunft ist mit Christopher ?????
5          3          Zurück in die Zukunft ist mit Christopher Lloyd

Bei dem Query, den ich suche, möchte ich der Datenbank also sagen "gib mir infoID 3 und 5 und von dort jeweils den höchsten "version"-Wert" und das soll dann zurückgeben:

Code:
3          4        / Der Zweite Weltkrieg ging bis 1945.
5          3        / Zurück in die Zukunft ist mit Christopher Lloyd


Sorry für a) das abstrakte Beispiel von vorher, ich hatte gedacht, das wäre einfacher zu erklären; und b) für das Weltkriegsbeispiel, falls jemand Anstoß daran findet.


Danke und viele Grüße,

Adrian
 
Zuletzt bearbeitet:
Ohne Sub-Select sehe ich nur etwas in dieser Form:

Code:
SELECT
	GROUP_CONCAT(
		CONCAT(
			'[', name, '][', alter, '][', automarke, ']'
		) ORDER BY alter DESC
	)
FROM
	tabelle
GROUP BY
	automarke
 
Zurück
Oben