web-dev-qa-db-ja.com

「ベストマッチ」によるMySQLの順序

ライブ検索を使用してそのテーブルを検索するための単語と入力フィールドを含むテーブルがあります。現在、次のクエリを使用してテーブルを検索しています。

SELECT Word FROM words WHERE Word LIKE '%searchstring%' ORDER BY Word ASC

Wordの先頭で文字列が見つかったものが最初に来て、Wordで文字列が後で現れるものが最後になるように結果を並べる方法はありますか?

例:「hab」を検索すると、現在返されます

  1. a lphabet
  2. h abit
  3. r ehab

しかし、私はそれをこのようにしたい:

  1. hab it(最初は「hab」だからです)
  2. alp hab et(2番目は「hab」が単語の中央にあるため)
  3. re hab(「hab」は単語の末尾にあるため最後)

または少なくともこの方法で:

  1. hab it(最初は「hab」だからです)
  2. re hab(「hab」は3番目の文字から始まるため、2番目)
  3. alp hab et(最後は「hab」が4番目の文字で始まるため)

誰かがこれで私を助けることができたら素晴らしいでしょう!

31
eevaa

最初の方法(Wordを起動し、Wordの途中で終了し、Wordを終了する)を行うには、次のようにします。

SELECT Word
FROM words
WHERE Word LIKE '%searchstring%'
ORDER BY
  CASE
    WHEN Word LIKE 'searchstring%' THEN 1
    WHEN Word LIKE '%searchstring' THEN 3
    ELSE 2
  END

2番目の方法(一致した文字列の位置)で行うには、 LOCATE function を使用します。

SELECT Word
FROM words
WHERE Word LIKE '%searchstring%'
ORDER BY LOCATE('searchstring', Word)

たとえば、複数のWordがhabで始まる場合にタイブレーカーが必要になる場合もあります。それを行うには、次のことをお勧めします。

SELECT Word
FROM words
WHERE Word LIKE '%searchstring%'
ORDER BY <whatever>, Word

habで始まる複数の単語の場合、habで始まる単語はグループ化され、アルファベット順にソートされます。

69
Ed Gibbs

この方法を試してください:

SELECT Word 
FROM words 
WHERE Word LIKE '%searchstring%' 
ORDER BY CASE WHEN Word = 'searchstring' THEN 0  
              WHEN Word LIKE 'searchstring%' THEN 1  
              WHEN Word LIKE '%searchstring%' THEN 2  
              WHEN Word LIKE '%searchstring' THEN 3  
              ELSE 4
         END, Word ASC
13
Parado

INSTR関数を使用して、Word内の検索文字列の開始位置を返すことができます。

 ORDER BY INSTR(Word,searchstring)

検索文字列が2つの異なる単語の同じ位置にある場合に結果セットをより確定的にするには、ORDER BYに2番目の式を追加します。

 ORDER BY INSTR(Word,searchstring), Word

(たとえば、検索文字列habは、chablisshabbyの両方の2番目の位置に表示されます)

7
spencer7593