我在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
显示在底部而不是顶部。
答案 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噩梦,就像其他答案所建议的那样 - 但是这会让你的指数变得无用,所以这对于大桌来说将是性能噩梦。