2 Stimmen

MySQL Frage ORDER BY `Benutzer_ID` IN (1,2,3) AND `Name`

Ich habe nach einer bestehenden Frage zu diesem Thema gesucht, aber ich bin mir nicht sicher, wonach ich suchen soll. Ich bin auf der Suche nach einer Möglichkeit, meine Ergebnisse auf der Grundlage einer Liste von IDs und einer zweiten Variablen zu bestellen.

Stellen Sie sich den folgenden Datensatz vor

user_id  user_name
------------------
   1       Peter
   2       John
   3       Luke
   4       Tim
   5       George
   6       Michael
   ~       etcetera

Nun habe ich eine Liste von Benutzerkennungen (sagen wir 1, 4, 5), mit denen ich das Ergebnis meiner Abfrage beginnen möchte.

Also dachte ich:

 // Edit: replaced 'AND' with ','
 SELECT * FROM `user` ORDER BY `user_id` IN (1,4,5), `name`

Würde etwas wie zurückgeben:

user_id  user_name
------------------
   1       Peter   <-- Notice the 1,4,5 at the top
   4       Tim
   5       George
   2       John    <-- After that its just alphabetical
   3       Luke
   6       Michael
   ~       etcetera

Aber das tut es nicht. Es sieht so aus, als ob es die Sortieranweisungen einfach ignoriert. Weiß jemand, was ich falsch mache? Ist es überhaupt möglich, so etwas zu tun?

3voto

Richard Inglis Punkte 5720

Sie könnten die beiden Teile separat erstellen und sie mit einer UNION zusammenfügen...

SELECT * FROM user 
WHERE user_id IN (1,4,5)
ORDER BY user_id

UNION

SELECT * FROM user 
WHERE user_id NOT IN (1,4,5)
ORDER BY user_name

3voto

Chandu Punkte 79046

Versuchen Sie dies:

 SELECT * 
        FROM    `user` 
    ORDER BY 
        CASE 
            WHEN `user_id` IN (1,4,5) THEN 1
            ELSE `user_id`
        END,
        `name`

3voto

gbn Punkte 407102
SELECT *
FROM user 
ORDER BY
   CASE WHEN user_id IN (1,4,5) THEN 0 ELSE 1 END,
   CASE WHEN user_id IN (1,4,5) THEN user_id ELSE 1 END,
   name

Edit: entfernt WHERE

2voto

Jacob Eggers Punkte 8751

Versuchen Sie, die AND zu einer ,

SELECT * FROM `user` ORDER BY `user_id` IN (1,4,5) desc, `name`

1voto

RolandoMySQLDBA Punkte 42705

Die gewünschte Abfrage ist diese

SELECT * FROM user
ORDER BY
IF(FIELD(user_id,1,4,5)=0,99999,FIELD(user_id,1,4,5)),user_name;

Ich habe Ihre Beispieldaten geladen und die Abfrage in MySQL 5.5.12 unter Windows ausgeführt

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 38
Server version: 5.5.12 MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

MySQL (Current test) :: USE example
Database changed
MySQL (Current example) :: DROP TABLE IF EXISTS user;
  user_name VARCHAR(20)
);
INSERT INTO user VALUES
(1,'Peter'),(2,'John'),
(3,'Luke'),(4,'Tim'),
(5,'George'),(6,'Michael');
SELECT * FROM user;
SELECT * FROM user
ORDER BY
IF(FIELD(user_id,1,4,5)=0,99999,FIELD(user_id,1,4,5)),user_name;
Query OK, 0 rows affected (0.02 sec)

MySQL (Current example) :: CREATE TABLE user
    -> (
    ->   user_id INT,
    ->   user_name VARCHAR(20)
    -> );
Query OK, 0 rows affected (0.08 sec)

MySQL (Current example) :: INSERT INTO user VALUES
    -> (1,'Peter'),(2,'John'),
    -> (3,'Luke'),(4,'Tim'),
    -> (5,'George'),(6,'Michael');
Query OK, 6 rows affected (0.02 sec)
Records: 6  Duplicates: 0  Warnings: 0

MySQL (Current example) :: SELECT * FROM user;
+---------+-----------+
| user_id | user_name |
+---------+-----------+
|       1 | Peter     |
|       2 | John      |
|       3 | Luke      |
|       4 | Tim       |
|       5 | George    |
|       6 | Michael   |
+---------+-----------+
6 rows in set (0.00 sec)

MySQL (Current example) :: SELECT * FROM user
    -> ORDER BY
    -> IF(FIELD(user_id,1,4,5)=0,99999,FIELD(user_id,1,4,5)),user_name;
+---------+-----------+
| user_id | user_name |
+---------+-----------+
|       1 | Peter     |
|       4 | Tim       |
|       5 | George    |
|       2 | John      |
|       3 | Luke      |
|       6 | Michael   |
+---------+-----------+
6 rows in set (0.00 sec)

MySQL (Current example) ::

Probieren Sie es aus!!!

UPDATE 2011-07-26 13:37 EDT

Wenn die Reihenfolge der Liste wichtig ist, schreiben Sie die Liste einfach nach Bedarf.

BEISPIEL: Wenn Sie die Liste in der Reihenfolge 4,1,5 benötigen, sollte die Abfrage wie folgt aussehen:

SELECT * FROM user
ORDER BY
IF(FIELD(user_id,4,1,5)=0,99999,FIELD(user_id,4,1,5)),user_name;

Hier ist die Ausführung mit denselben Beispieldaten:

MySQL (Current example) :: SELECT * FROM user
    ->     ORDER BY
    ->     IF(FIELD(user_id,4,1,5)=0,99999,FIELD(user_id,4,1,5)),user_name;
+---------+-----------+
| user_id | user_name |
+---------+-----------+
|       4 | Tim       |
|       1 | Peter     |
|       5 | George    |
|       2 | John      |
|       3 | Luke      |
|       6 | Michael   |
+---------+-----------+
6 rows in set (0.00 sec)

MySQL (Current example) ::

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X