sql >> データベース >  >> RDS >> Mysql

SQLの%を使用した単語アナグラマー

    まず、あなたの質問の誤りを訂正したいと思います。クエリでは、_を意味します %ではありません 。 % 任意の数の文字(ゼロ以上)を意味します。 _を使用する 正確に1文字を意味します。

    さて、解決策に移りましょう...データベースに保存されているソートされた単語は実際には必要ありません。あなたはこれを行うことができます:

    SELECT word
    FROM dictionary
    WHERE CHAR_LENGTH(word) = 6
    AND word LIKE '%W%'
    AND word LIKE '%O%'
    AND word LIKE '%R%'
    AND word LIKE '%D%'
    

    入力に重複する文字がある場合は、これを正しく処理して、すべての結果に重複する文字がすべて含まれるようにする必要があります。たとえば、入力がFOO__の場合 各単語が両方の%F%と一致することを確認する必要があります および%O%O%

    SELECT word
    FROM dictionary
    WHERE CHAR_LENGTH(word) = 5
    AND word LIKE '%F%'
    AND word LIKE '%O%O%'
    

    このアプローチではテーブルを完全にスキャンする必要があるため、特に効率的ではないことに注意してください。各単語の長さを別々の列に格納し、その列にインデックスを付けることで、状況を少し改善できます。

    sortedwordがある場合 次に、%を省略することでパフォーマンスを向上させることができます sortedwordに連続して表示されることがわかっているため、重複する文字の間 。これにより、失敗した一致に必要なバックトラックの量が減るため、パフォーマンスが向上する可能性があります。

    SELECT word
    FROM dictionary
    WHERE CHAR_LENGTH(word) = 5
    AND sortedword LIKE '%F%'
    AND sortedword LIKE '%OO%'
    

    sortedwordを必要とする別のアプローチ 出席するのは次のとおりです:

    SELECT word
    FROM dictionary
    WHERE CHAR_LENGTH(word) = 5
    AND sortedword LIKE '%D%O%R%W%'
    

    この場合も、テーブルを完全にスキャンする必要があります。繰り返しますが、文字を繰り返している場合は、%は必要ありません。 それらの間。

    SELECT word
    FROM dictionary
    WHERE CHAR_LENGTH(word) = 5
    AND sortedword LIKE '%F%OO%'
    



    1. PHP CRUD MySQLデータベースを使用して投稿を作成、編集、更新、削除します

    2. NaviCatMySQLクライアントを使用してデータベースに接続する方法

    3. LOAD DATA INFILEはYYYYMMDDをYYYY-MM-DDに簡単に変換しますか?

    4. 単純なPostgreSQLスクリプトで変数をどのように使用しますか?