0

私はデータベースにクエリを実行し、以下の提案を自動入力する検索ボックスを構築しています。

結果を次の順序で優先できるようにしたい:

1-完全一致

2-同じ2文字の文字で始まります

3-データベース内のどこかに文字列が含まれています

SQLステートメントがあります

SELECT * 
FROM Products 
WHERE ProductName LIKE ? 
OR ProductName LIKE ? 
GROUP BY ProductName 
ORDER BY ProductName ASC 
LIMIT 10

「コンピューター」という単語を検索する例

「co」と入力すると、次のように表示されます。

  • co -co
  • コンピュータ_
  • コンピュータデスク
  • ac co unt

しかし、「コンピュータ」への検索を進めるとき

  • コンピューター
  • コンピューターデッキ

最初のバインディングパラメータには%computer%が含まれ、2番目のバインディングパラメータにはc%omputer%が含まれます

助けてくれてありがとう、そして何か明確にする必要があるなら私に知らせてください。

4

3 に答える 3

1
SELECT * FROM Products WHERE ProductName = ? LIMIT 10 UNION
SELECT * FROM Products WHERE ProductName LIKE ? LIMIT 10 UNION
SELECT * FROM Products WHERE ProductName LIKE ? LIMIT 10

これはうまくいきます、最初の?'co'を2番目に保持しますか?'co%'と3番目の?'%co%'を保持します

これにより、最初に完全一致が優先され、次に文字列から始まり、次に文字列が含まれます。

于 2012-08-24T21:55:49.857 に答える
0

私は SQL の第一人者ではなく、MySQL を使用したことがないため、これが機能するかどうかはわかりませんが、この投稿を見れば

SQL: 特定の列内の部分文字列を使用した ORDER BY ... 可能ですか?

たぶん、このようなものがうまくいくでしょう:

ORDER BY
CAST(SUBSTRING(ProductName, 1, @ProductName.Count()) AS INT) DESC,  -- Year
CASE
    WHEN issue LIKE @productName THEN 1
    WHEN issue LIKE @productName + '%' THEN 2
    WHEN issue LIKE '%' + @productName THEN 3
END
LIMIT 10

とにかく頑張って問題を解決してください!私には遅すぎるので寝ます。うまくいかない場合は、明日私の脳が機能するかどうか、まだ解決していないかどうかを確認します:)

于 2012-08-24T22:40:22.570 に答える
0

MYSQLでUNIONを使用して、条件に合わせて個別のクエリを組み合わせます。トップ 10 を提供するスーパー セレクトを 1 つ用意します。

select * 
from (
  -- exact macth
  SELECT 1 as prio, *  
  FROM Products  
  WHERE ProductName = ?  
  GROUP BY ProductName  
  ORDER BY ProductName ASC  
  LIMIT 10 
  UNION
  -- start with
  SELECT 2 as prio, *  
  FROM Products  
  WHERE ProductName LIKE ?*  
  GROUP BY ProductName  
  ORDER BY ProductName ASC  
  LIMIT 10 
  UNION
  -- anywhere -- 
  SELECT 3 as prio, *  
  FROM Products  
  WHERE ProductName LIKE *?*  
  GROUP BY ProductName  
  ORDER BY ProductName ASC  
  LIMIT 10 
)
ORDER BY prio, ProductName ASC  
LIMIT 10 
于 2012-08-24T21:53:47.603 に答える