2009-10-19 7 views
34

私は 'cards'というINNODBテーブルに約20,000行ありますので、FULLTEXTはオプションではありません。MySQL - リリースで注文するには? INNODBテーブル

この表を考えてみてください。

id  |  name  |  description 
---------------------------------------------------------- 
1  John Smith  Just some dude 
2  Ted Johnson  Another dude 
3  Johnathan Todd This guy too 
4  Susan Smith  Her too 
5  Sam John Bond And him 
6  John Smith  Same guy as num 1, another record 
7  John Adams  Last guy, promise 

ので、ユーザーの検索は、私は結果の順になるように設定したい、「ジョン」のためと言う:それ私たちに注意してください

7  John Adams 
6  John Smith 
3  Johnathan Todd 
5  Sam John Bond 
2  Ted Johnson 

ジョンスミスを一度引っ張っただけで、私たちは彼の最近のエントリーを取った。私のデータのせいで、すべての名前は同じ正確な人物のため、John Smithという名前の2人の人を心配する必要はありません。 アイデア?私が何かを明確にすることができたら教えてください。

+1

あなたは、ない関連度(ただし、あなたがいることを定義) "姓、ファーストネーム" で注文したいように見えます。これは正しいです? – Tomalak

答えて

110

バージョン1:

SELECT max(id) id, name 
    FROM cards 
WHERE name like '%John%' 
GROUP BY name 
ORDER BY CASE WHEN name like 'John %' THEN 0 
       WHEN name like 'John%' THEN 1 
       WHEN name like '% John%' THEN 2 
       ELSE 3 
      END, name 

バージョン2:

SELECT max(id) id, name 
    FROM cards 
WHERE name like '%John%' 
GROUP BY name 
ORDER BY CASE WHEN name like 'John%' THEN 0 
       WHEN name like '% %John% %' THEN 1 
       WHEN name like '%John' THEN 2 
       ELSE 3 
      END, name 
+0

驚くばかり!それはまさに私が望んだように動作します。ありがとうnajmeddine! – k00k

+1

喜んで助けてください。より多くのケースを処理するために少し修正しました。 – manji

+0

私は特定のケースで他の方法がうまくいくと思いますが、どちらも他の人に役立つかもしれません。後世のためにそこに両方を置くことができますか? – k00k

関連する問題