2012-01-07 10 views
0

私は、MySQLデータベースにこのクエリを実行している:例外を指定してMySql結果を注文するにはどうすればよいですか?

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

このデータセット戻っている:_thumbnail_idが最初に来るように、私は、その後に続く、meta_keyで注文することができますどのように

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

dogs_image-2_thumbnail_id、次にdogs_image-3_thumbnail_id

私が単純にorder by meta_key ascを使用した場合、番号が付けられた画像は順番に並んでいますが、_thumbnail_idは上部ではなく下部に表示されています。

+0

meta_value列があなたが望む順序であることはまさにチャンスですか? –

+0

画像で望むように結果セットを得るにはどうしましたか? – cspray

+0

"order by"句を指定しないで実行すると、それが返されますが、それはちょうどチャンスであると思います。 – cwd

答えて

4

これはいかがですか?

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はあなたが持っている唯一の奇数の場合であると仮定しています。

+0

@nick rulezでもmysqlコマンドの大文字の書式設定の正しいb/cとしてこの1つを選択しました答えも完璧に働いた。 – cwd

+0

@CwdええSQLの書式設定に関しては少しOCDです.Dのソリューションがうまくいきました!! –

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 
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` 

を作る これはまた、意志のコストあなたは2つの列のインデックスのためのいくつかのスペース

またはより良い解決策は、データベースのどこか別の場所にデータをソートすることです(あなたは何かのスクリプトからそれを照会するのですか?)。

他の回答で示唆されているような、場合によっては悪夢を紹介しますが、これはインデックスが役に立たないため、大きなテーブルのパフォーマンスの悪夢となります。

+0

ちょっと残酷に見える – cwd

+0

なぜ他の場所でコードを書くのが良いソリューションなのか?おそらく '一度だけ、手動クエリ実行の状況'を除いて、大雑把な並べ替えのためのdbのインデックスの使用法を駄目にしていると呼びます。 –

+0

上記の 'case'関数は単純な解決法のように見えると思います。このような観点から感謝します。 – cwd

関連する問題