Einträge erst sortieren, dann gruppieren...

erselbst

Grünschnabel
Folgende Daten habe ich:

Code:
name   | version
-------+---------
a.html | 1
a.html | 2
b.html | 1

Ich möchte nun alle Einträge sortiert nach Version DESC anzeigen, wobei doppelte Namen zu einem Eintrag Gruppiert werden sollen.

Da GROUP BY vor ODER BY kommt:

Code:
SELECT * FROM `table` GROUP BY `name` ORDER BY `version` DESC

erhalte ich immer nur folgendes Ergebnis:

Code:
a.html | 1
b.html | 1

Ich möchte aber gern, dass zuerst nach der Version DESC sortiert wird und danach nach Name gruppiert wird, so dass folgendes dabei raus kommt:

Code:
a.html | 2
b.html | 1

Kann mir jemand sagen, wie das geht?
 
Schau mal, das wären meine Daten in der Tabelle.

Code:
id| name                | path | version | trash
--+---------------------+------+---------+------
1 | index.inc.php       | -    | 1       | off
2 | index.inc.php       | -    | 2       | off
3 | language-de.inc.php | lang | 1       | off
4 | language-en.inc.php | lang | 1       | off
5 | language-de.inc.php | lang | 2       | off
6 | language-ru.inc.php | lang | 1       | on

Diese Query soll mir nun alle Dateien mit dem 'path' => 'lang' und 'trash' => 'off' anzeigen. Dabei soll die Ausgabe nach 'name' ASC, 'version' DESC ausgegeben werden. Doppelte Einträge sollen durch 'name' gruppiert werden.

Code:
SELECT `id`, `name`, MAX(`version`) FROM `table`
WHERE `path` LIKE 'lang'
AND `trash` LIKE 'off'
GROUP BY `name`
ORDER BY `name` ASC

Als Ergebnis bekomme ich folgendes:

Code:
id| name                | MAX(`version`)
--+---------------------+---------------
3 | language-de.inc.php | 2
4 | language-en.inc.php | 1

Eigendlich sollte die row mit der ID 5, dann die row mit der ID 4 angezeigt werden.
 
Zuerst pro Name die Maximale Version ermitteln und das Resultat mit der Tabelle verknüpfen
SQL:
SELECT
	t.*
FROM
	`table` AS t,
	(
		SELECT
			`name`,
			MAX(version) AS version
		FROM
			`table`
		WHERE
			path = 'lang'
			AND trash = 'off'
		GROUP BY
			`name`
	) AS mv
WHERE
	t.`name` = mv.`name`
	AND t.version = mv.version
ORDER BY 
	t.`name`
 
Zuletzt bearbeitet von einem Moderator:
Zurück