如何订购带有异常的MySql结果?

时间:2012-01-07 22:01:39

标签: mysql sql-order-by

我在MYSql数据库上运行此查询:

select * from wp_postmeta
where meta_key LIKE "%_thumbnail_id"
and post_id = 897

它返回此数据集:

Picture.png http://img713.imageshack.us/img713/9065/picturezo.png

如何按meta_key订购,以便_thumbnail_id先到先,然后dogs_image-2_thumbnail_id然后再dogs_image-3_thumbnail_id

如果我只是使用order by meta_key asc编号的图片是有序的,但_thumbnail_id显示在底部而不是顶部。

3 个答案:

答案 0 :(得分:5)

这个怎么样?

SELECT * 
FROM wp_postmeta
WHERE meta_key LIKE "%_thumbnail_id" AND post_id = 897
ORDER BY (CASE WHEN meta_key = '_thumbnail_id' THEN 0 ELSE 1 END) ASC, meta_key

我假设 _thumbnail_id 是你唯一的奇怪案例。

答案 1 :(得分:1)

select * from wp_postmeta
where meta_key LIKE "%_thumbnail_id"
and post_id = 897
order by case when meta_key = '_thumbnail_id' then 0 else 1 end, meta_key

答案 2 :(得分:0)

引入其他order列并进行两列排序

create table test (
     (...)
     meta_key varchar(255), 
     `order` integer default 1000,
     key (`order`, `meta_key`) -- optional, more disk space usage, faster sorting
)

-- then do
select * from `test` order by `order`, `meta_key`

您当然必须手动维护订单列值(即“例外”给出的值大于或小于默认值) 这也会花费你一些空间用于两列索引

或更好的解决方案是将数据排序到除db之外的其他位置(您从某种脚本查询它,不是吗?)。

或者引入一些if-case噩梦,就像其他答案所建议的那样 - 但是这会让你的指数变得无用,所以这对于大桌来说将是性能噩梦。