1

複数の単語を検索できる検索スクリプトを作成したいのですが、スクリプトは特定の行ではなくすべての行で単語を検索します。例えば。

  __________________________   ________
 |Cheese                    | | Search |
  ——————————————————————————   ————————

次に、次のようなphpスクリプトを作成します。

SELECT * FROM テーブル WHERE column1 = "$value" OR column2 = "$value" OR column3 = "$value" ... ;

これにより、「チーズ」という単語がいずれかの列に表示される結果が表示されます。問題は、人々が「チーズ」とおそらく「キッチン」の両方を検索できるようにしたいということですが、単語を分離して次のようなものを検索する必要があります。

SELECT * FROM table WHERE column1 = "$value" OR column2 = "$value" OR column3 = "$value" ... AND column1 = "$value2" OR column2 = "$value2" OR column3 = "$value2" . ..;

問題は、これを行う方法が本当にわからないということです。単語の区切りも、SQLデータベースで単語を見つける方法もありません..また、「チーズ」が一部である単語を検索する方法もわかりません..「チーズケーキ」のように..

どなたか作り方がわかる方いましたら教えてください..

ありがとうございました。

4

5 に答える 5

2

MySQL のフルテキスト インデックスを確認してください: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

全文索引付けは、索引付けされた列内のすべての単語の索引を作成します (デフォルトでは、単語は少なくとも 4 文字である必要がありますが、これは MySQL ini ファイルで変更できます)。次に、単語の先頭を含む複数の単語に対して検索を実行できます (チーズ* はチーズケーキに一致します... ただし、インデックスはアルファベット順であるため、インデックスを使用して「ケーキ」をチーズケーキに一致させる方法はないことに注意してください)。これには次の利点があります。

  1. 一連の AND () OR () ステートメントよりもはるかに高速です
  2. 関連性インデックスを返すことができるため、すべてのキーワードに 5 回一致する行は、単語の 1 つを 1 回含む行よりも関連性が高いことがわかります。
于 2012-05-07T21:48:12.770 に答える
2

SQL で必要なものはすべて正しい括弧です。

SELECT *
FROM table
WHERE (column1 = "$value" OR column2 = "$value" OR column3 = "$value") AND
      (column1 = "$value2" OR column2 = "$value2" OR column3 = "$value2")

「AND」は「OR」の前に評価されます。

ところで、複数の列を検索する必要があるということは、データ モデルに欠点がある可能性があることを示しています。各単語を別々の行に配置するテーブル構造が必要になる場合があります。

于 2012-05-07T21:47:10.073 に答える
1

1 つの句で行全体を検索することはできません。ただし、LIKE 句を使用して「チーズ」などの単語を検索し、「チーズケーキ」と一致させることができます。

これは、あなたが思っているよりもはるかに複雑になります。MySQL の MyISAM の全文検索のようなものを調べることをお勧めします。または、Sphinx のようなものを使用して頻繁に検索したり、大量のデータ セットを検索したりする予定がある場合は、それを検討することをお勧めします。また、現在のルートに従うことにした場合、探しているのは LIKE 句です。

とにかく、チーズやケーキを含む単語を検索するには:

SELECT blah FROM tbl WHERE (col1 LIKE '%cheese%' OR col2 LIKE '%cheese%') AND (col1 LIKE 'cake' OR col2 LIKE 'cake');

ただし、これは非常に非効率的です。インデックスを使用することはできません。つまり、クエリごとにフル テーブル スキャンが必要になります。

于 2012-05-07T21:48:31.600 に答える
1

あなたはそれらのクエリで順調に進んでいます。

最も顕著な欠落は、SQL のワイルドカード演算子です。これは、部分的な文字列を照合するために使用されます。たとえば、これは「チーズケーキ」と「チーズクラッカー」のレコードを検索します。

SELECT *
FROM table
WHERE column1 = '%cheese%'

検索を処理するより高度な方法には、検索するデータのインデックス作成が含まれます。自分で行うか、サードパーティまたは特定のデータベースツールを使用してください。これをGoogleで調べてください。

ただし、多くの検索でヒットしていない通常のサイトの場合、現在のアプローチで問題ありません。

もう 1 つ、質問が検索ボックス内の単語ごとに SQL の行を自動的に追加する方法に関するものである場合は、もう少し学習する必要があります。公式の PHP ドキュメント (php.net) でこれらの用語を探すことから始めます。

  • 爆発する
  • foreach
于 2012-05-07T21:53:38.253 に答える
-1

必要なすべてのデータを取得し、文字列関数を使用して干し草の山から検索されたアイテムをカンパしてみませんか。stristr が役立つと思います。または、SQL クエリを使用することもできますが、DB にストレスがかかる可能性があります。間違っている場合は修正してください。

于 2012-05-07T21:49:13.050 に答える