Sortieren nach "Einzelelementen" einer GROUP?

Sortieren nach "Einzelelementen" einer GROUP?

am 03.11.2007 18:07:29 von Sebastian Suchanek

Hallo NG!

Ist es möglich, nach einzelnen Werten innerhalb eines
ge-GROUP-ten Ergebnisses zu sortieren?
Folgendes stark vereinfachtes Beispiel soll die Problematik
verdeutlichen:

nr | name
---+-------
1 | Klaus
2 | Heinz
3 | Bärbel
4 | Heinz
4 | Peter
6 | Heinz

Wenn man darauf folgende Abfrage

SELECT
GROUP_CONCAT(DISTINCT name ORDER BY name SEPARATOR ' / ') AS foobar,
nr
FROM test
GROUP BY nr
ORDER BY foobar, nr

anwendet, erhält man das Ergebnis

Bärbel | 3
Heinz | 2
Heinz | 6
Heinz / Peter | 4
Klaus | 1

Was ich stattdessen aber möchte, ist dieses Ergebnis:

Bärbel | 3
Heinz | 2
Heinz / Peter | 4
Heinz | 6
Klaus | 1

Es soll also zunächst nach dem *ersten* Namen im
GROUP_CONCAT, dann nach der nr-Spalte und erst *dann* nach
evtl. weiteren Namen sortiert werden.
Ist das irgendwie möglich?


TIA,

Sebastian

--
http://www.baumaschinen-modelle.net
http://www.schwerlast-rhein-main.de

Re: Sortieren nach "Einzelelementen" einer GROUP?

am 04.11.2007 00:24:05 von Claus Reibenstein

Sebastian Suchanek schrieb:

> SELECT
> GROUP_CONCAT(DISTINCT name ORDER BY name SEPARATOR ' / ') AS foobar,
> nr
> FROM test
> GROUP BY nr
> ORDER BY foobar, nr
>
> Was ich stattdessen aber möchte, ist dieses Ergebnis:
>
> [...]
>
> Es soll also zunächst nach dem *ersten* Namen im
> GROUP_CONCAT, dann nach der nr-Spalte und erst *dann* nach
> evtl. weiteren Namen sortiert werden.
> Ist das irgendwie möglich?

Du willst also nach dem Namen (und nicht nach foobar) und dann nach der
Nummer suchen? Dann sollte das hier das Richtige liefern:

SELECT ... ORDER BY name, nr

Gruß. Claus

Re: Sortieren nach "Einzelelementen" einer GROUP?

am 04.11.2007 10:38:27 von Sebastian Suchanek

Thus spoke Claus Reibenstein:

> [...]
> Dann sollte das hier das
> Richtige liefern:
>
> SELECT ... ORDER BY name, nr

Jein. :-)
Das liefert zwar im Beispiel aus meinem OP die richtige Antwort,
allerdings merke ich gerade, daß ich das Beispiel leider doch zu
stark von meinem realen Problem abstrahiert habe.

In Wahrheit wird entstammen die Zellen, die im GROUP_CONCAT
zusammengefasst werden, aus einer zweiten Tabelle, die mit der
"Haupttabelle" n:m-verknüpft ist. Sortiert wird dabei innerhalb
des GROUP_CONCATs nach einer Spalte "weight", die in der n:m-
Tabelle enthalten ist.
(Falls diese Beschreibung zu abstrakt war, kann ich natürlich
auch noch ein Beispiel geben.)

Testweise habe ich mir mal das Feld $zweiteTabelle.name (also
die Felder, die ge-GROUP_CONCAT-et werden) mit ausgeben lassen -
eine Systematik, welcher der einzelnen Werte darin erscheint,
habe ich leider bislang nicht gefunden. :-(


Tschüs,

Sebastian

--
http://www.baumaschinen-modelle.net
http://www.schwerlast-rhein-main.de

Re: Sortieren nach "Einzelelementen" einer GROUP?

am 04.11.2007 16:14:17 von Claus Reibenstein

Sebastian Suchanek schrieb:

> Thus spoke Claus Reibenstein:
>
>> Dann sollte das hier das
>> Richtige liefern:
>>
>> SELECT ... ORDER BY name, nr
>
> Jein. :-)
> Das liefert zwar im Beispiel aus meinem OP die richtige Antwort,
> allerdings merke ich gerade, daß ich das Beispiel leider doch zu
> stark von meinem realen Problem abstrahiert habe.

Schade.

> Testweise habe ich mir mal das Feld $zweiteTabelle.name (also
> die Felder, die ge-GROUP_CONCAT-et werden) mit ausgeben lassen -
> eine Systematik, welcher der einzelnen Werte darin erscheint,
> habe ich leider bislang nicht gefunden. :-(

Vielleicht ORDER BY MIN(name)? Versuch macht kluch.

Ansonsten fällt mir auf die Schnelle auch nichts Vernünftiges ein.

Gruß. Claus

Re: Sortieren nach "Einzelelementen" einer GROUP?

am 04.11.2007 16:16:50 von B.Steinbrink

On Sun, 04 Nov 2007 10:38:27 +0100, Sebastian Suchanek wrote:

> Thus spoke Claus Reibenstein:
>
>> [...]
>> Dann sollte das hier das
>> Richtige liefern:
>>
>> SELECT ... ORDER BY name, nr
>
> Jein. :-)
> Das liefert zwar im Beispiel aus meinem OP die richtige Antwort,
> allerdings merke ich gerade, daß ich das Beispiel leider doch zu stark
> von meinem realen Problem abstrahiert habe.
>
> In Wahrheit wird entstammen die Zellen, die im GROUP_CONCAT
> zusammengefasst werden, aus einer zweiten Tabelle, die mit der
> "Haupttabelle" n:m-verknüpft ist. Sortiert wird dabei innerhalb des
> GROUP_CONCATs nach einer Spalte "weight", die in der n:m- Tabelle
> enthalten ist.
> (Falls diese Beschreibung zu abstrakt war, kann ich natürlich auch noch
> ein Beispiel geben.)
>
> Testweise habe ich mir mal das Feld $zweiteTabelle.name (also die
> Felder, die ge-GROUP_CONCAT-et werden) mit ausgeben lassen - eine
> Systematik, welcher der einzelnen Werte darin erscheint, habe ich leider
> bislang nicht gefunden. :-(

Weil das aus deiner Perspektive auch zufällig ist. "name" ist nicht im
GROUP BY enthalten, den darfst du eigentlich nur per Aggregatsfunktion
benutzen (SQL Standard), MySQL ist aber auch einverstanden, wenn du ihn
einfach so benutzt und gibt dir irgendeinen Wert aus der jeweiligen
Gruppe.

Versuchs mit:

.... ORDER BY MIN(name), nr, foobar

Wobei foobar dein GROUP_CONCAT Wert ist.

Björn

Re: Sortieren nach "Einzelelementen" einer GROUP?

am 04.11.2007 18:02:43 von Sebastian Suchanek

Thus spoke Claus Reibenstein:

> [...]
> Vielleicht ORDER BY MIN(name)? Versuch macht kluch.

Ja, Versuch macht kluch - nein, MIN(name) hilft leider auch
nicht. ;-)

> Ansonsten fällt mir auf die Schnelle auch nichts
> Vernünftiges ein.

Ich hab's jetzt sozusagen mit der Holzhammermethode gelöst: Ein
Subquery, daß mir zu jedem "Enddatensatz" ganz gezielt den
"höchstwertigen" Namen in eine separate - auf Anwendungsebene
natürlich nicht sichtbare - Spalte liefert, nach der dann
sortiert wird.


Tschüs,

Sebastian

--
http://www.baumaschinen-modelle.net
http://www.schwerlast-rhein-main.de