Zwei Felder sortieren - aber nicht-hierarchisch

Hallo Experten,

man kann ja bei MySQL nach 2 (oder mehreren) Spalten sortieren. Dabei gibt’s eine primäre und eine sekundäre Sortierspalte.

Beispiel einer unsortierten 2-Spalten-Tabelle:

1|1
4|1
3|4
1|2
1|5
4|4
3|1

Wenn ich die primär nach der linken und sekundär nach der rechten Spalte sortiere, kommt sowas raus:

4|4
4|1
3|4
3|1
1|5
1|2
1|1

Ich hätte aber gerne, dass das Feld mit dem höcheren Wert jeweils als primäres und das mit dem niedrigeren Wert als sekundäres Sortierkriterium verwendet wird, auch wenn das von Zeile zu Zeile verschieden sein kann, also dass der höchte Wert (egal in welchem der Felder er steht) nach oben oder unten kommt.

1|5
4|4
3|4
4|1
3|3
3|1
1|2

Geht das irgendwie?

LG
Huttatta

Moin, Huttatta,

mich plagen arge Zweifel, ob ich überhaupt verstehe, was Du vorhast, deshalb ein Tipp: Bau Dein Muster als Excel-Tabelle auf und versuche dort - ohne VBA-Tricks - zu sortieren wie gewünscht. Wenn es dort nicht geht (was ich vermute), dann geht es auch in der Datenbank nicht.

Was auf jeden Fall geht, ob sinnvoll oder nicht: Vorher die Tabelle abfragen und davon abhängig die eine oder die andere Sortierung ansteuern.

Gruß Ralf

Hallo Experten,

Ich hätte aber gerne, dass das Feld mit dem höcheren Wert
jeweils als primäres und das mit dem niedrigeren Wert als
sekundäres Sortierkriterium verwendet wird, auch wenn das von
Zeile zu Zeile verschieden sein kann, also dass der höchte
Wert (egal in welchem der Felder er steht) nach oben oder
unten kommt.

1|5
4|4
3|4
4|1
3|3
3|1
1|2

Hallo Huttatta,
nur so eine Idee: bau dir eine Funktion mit zwei Eingabewerten, die eine umso größere Zahl liefert, je höher das Tupel sortiert werden soll und sortiere dann nach dem Wert der Funktion.

In etwa so (nur Pseudocode, kenne mich nicht mit MySQL-Syntax aus):

CREATE OR REPLACE FUNCTION my\_order(a NUMBER, b NUMBER)
RETURN NUMBER
IS -- a und b seien ganzzahlig positiv
 -- im Bereich von 1..9999 
 IF (a=b)
 then
 return a+1
 elsif (a\>b)
 return a + (b\*0.0001) -- s. Bedingung oben
 else
 return b + (a\*0.0001)
 end; 
END;
/

Dann könntest du deinen Sort so absetzen:

select
 col1, col2 -- ,weitere Spalten
from
 tabellen\_name
order by
 m\_sort(col1, col2);

Wie gesagt, nur eine Idee (ich weiss nicht ob MySQL das schluckt, bei Oracle könnte es so funktionieren).

Gruss
bernhard

Hallo,

Ich hätte aber gerne, dass das Feld mit dem höcheren Wert
jeweils als primäres und das mit dem niedrigeren Wert als
sekundäres Sortierkriterium verwendet wird, auch wenn das von
Zeile zu Zeile verschieden sein kann, also dass der höchte
Wert (egal in welchem der Felder er steht) nach oben oder
unten kommt.

so was ?

SELECT a,b FROM ... ORDER BY IF(a\>b,a,b) DESC, IF(a\>b,b,a) DESC

Alexander

Vielen Dank !!!
Hallo,

vielen Dank für eure schnellen Antworten. In der Zwischenzeit habe ich mir ein zugegebenermaßen nicht sehr elegantes (da Redundanz), aber funktionelles Workaround gebastelt, das es mir erlaubt, nur nach einer einzigen, zusätzlichen Spalte (in welcher der höhere der beiden Werte nochmal steht) zu sortieren. Da es sich um eine kleine Zahl handelt und die Datenmenge keine Rolle spielt, kann das auch so bleiben. Ich werde eure Vorschläge aber für den Fall, dass eine solche Sortierung mal wieder erforderlich wäre, ausprobieren.

LG
Huttatta