人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

SQLで、ある文字列を含むレコードを取得します。
ただし、文字列の先頭からマッチするものを優先させたいのです。
1回のSQLでできるでしょうか?

通常、
『SELECT * FROM hoge WHERE name LIKE '%w%' ORDER BY name ASC;』
と入力すると、
『arrow, now, snow, wake, world』
のような順番になります。
しかし、そうではなく、
『wake, world, arrow, now, snow』
のように、まず文字列の頭からヒットするものを優先したいのです。

つまり、
『WHERE name LIKE 'w%' ORDER BY name ASC』と
『WHERE name LIKE '%w%' AND name NOT LIKE 'w%' ORDER BY name ASC』
の結果を、混ぜ合わせるのではなく、前後につなぎ合わせたいのです。

MySQL、またはSQLiteにおいて、どのような方法を採ればいいでしょうか?
なるべく1文のSQLで行いたいのですが…。

●質問者: 宮崎雄策
●カテゴリ:ウェブ制作
✍キーワード:ASC hoge MySQL name SELECT
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● vegah
●10ポイント

今手元のPCでMSアクセスしかなくて、クエリーでやってみたのですが、

もうひとつ昇順のキイ項目を作ってそこに、

name LIKE 'w% だったら『1』をセットし、

そうでなかったら『2』をセットする

として、このキイ項目を昇順の第一キイとし、

nameを昇順の第二キイにすれば、wが先頭にくるnameの方が優先してソートされます。

◎質問者からの返答

すみません…。具体的なSQLで示してもらえないでしょうか。

不勉強なため、うまくイメージがわかなくて…。


2 ● b-wind
●10ポイント

素直にやれば UNION 使うのが手っ取り早そうだねぇ。

 SELECT * FROM hoge
 WHERE name LIKE 'w%' ORDER BY name ASC
UNION
 SELECT * FROM hoge
 WHERE name LIKE '%w%' AND name NOT LIKE 'w%' ORDER BY name ASC

MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.2.7.2 UNION 構文

SQLite が認識する SQL - Third impact

もちろん他の構文もあるけど、ややこしくなるだけの気がする。

◎質問者からの返答

すみません。UNIONではどうしてもうまくいかなかったので、

ややこしくてもかまいませんので、ほかの方法を教えていただけないでしょうか?


3 ● y-kawaz
●10ポイント

UNIONを使えば1回のSQLで単純に繋げられます。

SELECT * FROM hoge WHERE name LIKE 'w%' ORDER BY name ASC
UNION
SELECT * FROM hoge WHERE name LIKE '%w%' AND name NOT LIKE 'w%' ORDER BY name ASC;
◎質問者からの返答

なぜか私のPCでは、MySQLでもSQLite2でも、正常に動作しませんでした。

参考にした本では、括弧()でくくればいいとも書かれていましたが、

やはりうまくいかず…。

XAMPP1.7.2を入れているのですが、これがマズいんでしょうか…


4 ● y-kawaz
●70ポイント ベストアンサー

CASE文を使って以下のようにするのはどうでしょうか?

SELECT * FROM hoge WHERE name LIKE '%w%' ORDER BY (CASE WHEN name LIKE 'w%' THEN 0 ELSE 1 END), name ASC;

手元のSQLiteでは上手く動きました。

ただし大量データの場合のパフォーマンスがどうなるかは分かりませんが…。

◎質問者からの返答

こちらのMySQL、SQLiteでも問題なく動きました。

不勉強なため、CASE文の存在というものを知りませんでした。

教えていただいたSQLがどういう働きをしているのか

理解できるように勉強します。

ありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ