MySQL排序问题

3
我有一个相当简单的SQL查询,但是缺少一些东西,我还没有找到这个问题的答案。问题在于我选择了一些字段和几个ID,而我希望结果按照特定的顺序排序。查询如下:
SELECT `content`.* 
FROM   `content` 
WHERE  (user_id = "1" AND ( id = "4" OR id = "7" OR id = "5" OR id = "8" )) 

默认排序方式是“id ASC”(id 是我的主键),但在这种特殊情况下,我希望顺序为 4、7、5、8。
有什么想法吗?
5个回答

10
ORDER BY CASE user_id  
    WHEN "4" THEN 1  
    WHEN "7" THEN 2  
    WHEN "5" THEN 3  
    WHEN "8" THEN 4  
    ELSE 5  
END
如果你想要泛化它,你可以创建一个新表格,包含两列 - "user_id" 和 "order_by_val",然后连接(join)到它并使用 "ORDER BY order_by_val" 排序。
编辑: 根据 @Tim 的建议,MySQL 有一个专有函数 - FIELD() - 如他的帖子中所述,如果你不关心可移植性或函数返回值无法优化的问题,可以使用它。

您可能还可以查看 field(),我下面也展示了一些示例代码。上面的代码似乎有些啰嗦和混乱。 - Tim
@Tim,我不知道这个函数-知道它很方便(尽管是专有的,并且可能会在优化方面出现问题,正如你所知道的-但对于短列表来说不是问题)。 - dkretz

5

非常不错 :) 比le dorfier的解决方案更短,也更容易在Zend Framework的Zend_Db select()中实现。谢谢! - Bogdan Constantinescu

3

我通常处理这种奇怪的排序方式是使用case语句:

order by case id
             when "4" then 1
             when "7" then 2
             when "5" then 3
             when "8" then 4
             else 99
         end

不确定是否可以直接翻译成mysql,但这个想法应该是通用的。

1
ORDER BY CASE id WHEN 4 THEN 1 
                 WHEN 7 THEN 2 
                 WHEN 5 THEN 3 
                 WHEN 8 THEN 4 
                 ELSE 99
         END; 

0
您可以尝试将以下内容添加到查询的末尾。
ORDER BY CASE ID WHEN 4 THEN 1 WHEN 7 THEN 2 WHEN 5 THEN 3 WHEN 8 THEN 4 ELSE 5 END 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接