web-dev-qa-db-ja.com

MySQL-関連性で注文する方法は? INNODBテーブル

'cards'というINNODBテーブルに約20,000行あるので、FULLTEXTはオプションではありません。

この表を検討してください。

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

「JohnSmith」を一度だけプルしたので、彼の最新のエントリを取得したことに注意してください。私のデータによると、すべての名前はまったく同じ人物のものであり、ジョン・スミスという2人の異なる人物について心配する必要はありません。アイデア?何か明確にできるかどうか教えてください。

34
k00k

バージョン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
111
manji