MySQL ORDER问题

时间:2009-03-24 16:32:14

标签: sql mysql

我有一个非常简单的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 个答案:

答案 0 :(得分: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”,加入它,以及“ORDER BY order_by_val”。

<小时/> 编辑:Per @Tim,MySQL有一个专有函数 - FIELD() - 正如他在帖子中所提到的,如果你不关心可移植性,或者函数返回值是不可优化的问题。

答案 1 :(得分:5)

这将做你想要的:

select * 
from myTable
order by field(myID, 8, 7, 6) desc;

您可以设置您想要显示的任何ID(或其他)的顺序,之后其他任何ID都会跟随。希望有所帮助。

有关此问题的更多内容@ http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field

答案 2 :(得分:3)

我通常采用这种奇怪的排序方式是使用一个案例陈述:

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

不确定这是否直接转换为mysql,但这个想法应该。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

您可以尝试在查询结尾添加以下内容。

ORDER BY CASE ID WHEN 4 THEN 1 WHEN 7 THEN 2 WHEN 5 THEN 3 WHEN 8 THEN 4 ELSE 5 END