Php (1,2,3)中“user_id”和“name”的MySQL问题顺序`

Php (1,2,3)中“user_id”和“name”的MySQL问题顺序`,php,mysql,sql-order-by,Php,Mysql,Sql Order By,我一直在为这个问题寻找一个现有的问题,但我不确定要寻找什么。我正在寻找一种基于id列表和第二个变量对结果排序的方法 想象一下下面的记录集 user_id user_name ------------------ 1 Peter 2 John 3 Luke 4 Tim 5 George 6 Michael ~ etcetera 现在,我有了一个用户ID列表(比如1,4,

我一直在为这个问题寻找一个现有的问题,但我不确定要寻找什么。我正在寻找一种基于id列表和第二个变量对结果排序的方法

想象一下下面的记录集

user_id  user_name
------------------
   1       Peter
   2       John
   3       Luke
   4       Tim
   5       George
   6       Michael
   ~       etcetera
现在,我有了一个用户ID列表(比如1,4,5),我希望查询的结果从这个列表开始

所以我想:

 // Edit: replaced 'AND' with ','
 SELECT * FROM `user` ORDER BY `user_id` IN (1,4,5), `name`
将返回如下内容:

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
user\u id user\u name
------------------

1彼得你可以分别做这两部分,然后用一个接头把它们粘在一起

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
试试这个:

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

尝试将
更改为

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

编辑:已删除,其中

您要的查询是此查询

SELECT * FROM user
ORDER BY
IF(FIELD(user_id,1,4,5)=0,99999,FIELD(user_id,1,4,5)),user_name;
我加载了示例数据,并在Windows下的MySQL 5.5.12中运行了查询

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) ::
试试看

更新2011-07-26 13:37美国东部时间

如果列表的顺序很重要,只需根据需要编写列表即可

示例:如果需要按4,1,5顺序排列的列表,则查询应如下所示:

SELECT * FROM user
ORDER BY
IF(FIELD(user_id,4,1,5)=0,99999,FIELD(user_id,4,1,5)),user_name;
以下是使用相同样本数据执行的过程:

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) ::

可能会添加另一列进行排序,并给他们编号,然后按此新列进行排序。@Warface:恐怕用户id列表是动态的。每个用户都有一个不同的列表。@谢谢,这看起来就像我要找的一样!我会查出来的。当,揍我一顿。:)+1我会将
ELSE
语句的结果设置为2,而不是
user\u id
,尽管我选择了这个解决方案,将“ELSE user\u id”替换为“ELSE 2”。谢谢大家!你让我开心:)哈,事实上,这解释了为什么它忽略了我的分类指令:P谢谢,谢谢+1为您的麻烦:)感谢Cybernate和gbn,我已经有了一个有效的查询,但我会看看性能差异。
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) ::