Frage

Hallo und danke, dass Sie sich Zeit genommen haben, diese Frage zu lesen.

Ich verwende MySQL und möchte die Ergebnisse mit der Reihenfolge mit einer bestimmten Spalte sortieren. Die Ergebnisse müssen jedoch gemäß bestimmten Kriterien für diese Spalte geordnet werden. Zum Beispiel in der folgenden Tabelle möchte ich ORDER BY 'group', zuerst zeigen die 9,7,6 'group' items und am Ende 10,8,5 'group' items:

names     group
--------- ------
susanita  10
miguelito 5
mafalda   7
manolito  8
libertad  6
felipe    9
guille    8

vielen Dank im Voraus.

War es hilfreich?

Lösung

SELECT* FROM mytable ORDER BY
LOCATE(CONCAT('.',`group`,'.'),'.9.7.6.10.8.5.');

Ich nahm Ihre Beispieldaten, lädte sie in eine Tabelle namens MyTable und leitete sie.

Hier sind die Ergebnisse:

mysql> use test
Database changed
mysql> drop table if exists mytable;
Query OK, 0 rows affected (0.04 sec)

mysql> create table mytable
    -> (
    ->    names varchar(10),
    ->    `group` int
    -> );
Query OK, 0 rows affected (0.08 sec)

mysql> insert into mytable values
    -> ('susanita',  10),
    -> ('miguelito', 5),
    -> ('mafalda',   7),
    -> ('manolito',  8),
    -> ('libertad',  6),
    -> ('felipe',    9),
    -> ('guille',    8);
Query OK, 7 rows affected (0.09 sec)
Records: 7  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM mytable;
+-----------+-------+
| names     | group |
+-----------+-------+
| susanita  |    10 |
| miguelito |     5 |
| mafalda   |     7 |
| manolito  |     8 |
| libertad  |     6 |
| felipe    |     9 |
| guille    |     8 |
+-----------+-------+
7 rows in set (0.00 sec)

mysql> SELECT * FROM mytable ORDER BY
    -> LOCATE(CONCAT('.',`group`,'.'),'.9.7.6.10.8.5.');
+-----------+-------+
| names     | group |
+-----------+-------+
| felipe    |     9 |
| mafalda   |     7 |
| libertad  |     6 |
| susanita  |    10 |
| manolito  |     8 |
| guille    |     8 |
| miguelito |     5 |
+-----------+-------+
7 rows in set (0.01 sec)

mysql>

Versuche es !!!

Update 2011-09-06 12:33 EDT

Hier ist ein weiterer Ansatz:

SELECT* FROM mytable ORDER BY
IF(FIELD(`group`,9,7,6,10,8,5)=0,99999,FIELD(`group`,9,7,6,10,8,5));

Dies wird alle Gruppen als 9,7,6,10,8,5 zwingen, ganz unten in der Abfrage zu erscheinen.

Update 2011-09-06 14:39 EDT

mysql> SELECT names, `group`
    -> FROM mytable
    -> WHERE `group` IN (9,7,6,10,8,5)
    -> ORDER BY find_in_set(`group`,'9,7,6,10,8,5');
+-----------+-------+
| names     | group |
+-----------+-------+
| felipe    |     9 |
| mafalda   |     7 |
| libertad  |     6 |
| susanita  |    10 |
| manolito  |     8 |
| guille    |     8 |
| miguelito |     5 |
+-----------+-------+
7 rows in set (0.00 sec)

Hey @nick, dein arbeitest auch gegen meine Beispieldaten !!!

Andere Tipps

Verwenden Sie Mysql find_in_set() Funktionieren Sie dies. Es ist prägnanter, aber weniger tragbar als die Fallansatz GBN vorgeschlagen.

Zum Beispiel:

SELECT `names`, `group`
FROM my_table
WHERE `group` IN (9,7,6,10,8,5)
ORDER BY find_in_set(`group`,'9,7,6,10,8,5');

Weil es auf der String -Suche angewiesen ist, find_in_set() ist hauptsächlich für die Bestellung auf kleinen Sätzen leicht durchsuchbarer Schlüssel wie Ganzzahlen nützlich.

Normalerweise (es wird täglich in SO gefragt) würden Sie einen Fall verwenden, der Standard -SQL ist

ORDER BY
    CASE group
          WHEN 9 THEN 1
          WHEN 7 THEN 2
          WHEN 6 THEN 3
          WHEN 10 THEN 4
          WHEN 8 THEN 5
          WHEN 5 THEN 6
          ELSE 7
    END

Ich würde mich interessieren, wie dies über einen großen Datensatz mit der Locate -Methode (concat ...) von rolandomysqldba verglichen wird

Für ein komplexeres Beispiel siehe "Conversion fehlgeschlagen" Fehler mit der Reihenfolge durch Fallausdruck

Sie könnten es als als erstellen Auflauf Typ.

Enumwerte werden nach der Reihenfolge sortiert, in der die Aufzählungsmitglieder in der Spaltenspezifikation aufgeführt wurden. (Mit anderen Worten, Enum -Werte werden nach ihren Indexnummern sortiert.) Zum Beispiel 'a' sortiert vor 'B' für Enum ('A', 'B'), aber 'B' Sorts vor 'A' für Enum ('B', 'A').

Erstellen Sie also das Feld Enum als ENUM('9','7','6','10','8','5')

Haftungsausschluss: Ich unterstütze das nicht, weil ich vermute, dass Ihre group Die Säule muss dynamisch sein. Ich erwähne es nur als Option.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top