4

最初に質問してから (多くの...情報): ユーザーがドロップダウン ボックスから複数の回答を選択し、それらをプロファイルに保存してから、他のユーザーがキー入力できるようにしたい場合に、使いやすさと速度を考えるオプションは何ですか?彼らの検索基準(再び複数にすることができます)と最終的にそれらの複数の検索基準によってユーザーを見つけますか?

情報: 現時点では、出会い系サイトが使用するのと同じように、私のウェブサイトの一部がマッチメイキング システムであることに忙しくしています。

(私は自分のサイトに Mysqli、PHP、および jQuery を使用しています)

質問を詳しく説明するために、例として出会い系サイトを使用しています。ユーザー A は自分のプロフィールを入力し、特定の自動車ブランド (BMW、フォルクスワーゲン、メルセデス) の好みを入力します。ユーザー B は、BMW やメルセデスが好きなメンバーをサイトで検索したいと考えています。

私の最初のアイデアは、ユーザー A が複数の入力 HTML フィールドに入力し、それをデータベースの 1 つの列に配列 (またはコンマ区切り) として格納できるようにすることでした。次に、ユーザー B の配列が格納されている列を選択検索する方法を見つけます。

したがって、基本的に、ユーザー A は自分のプロファイルに複数の自動車ブランドを入力でき、ユーザー B は複数の自動車ブランドを基準に指定できます。選択クエリは、条件に一致する行をフェッチする必要があります。

入力フィールドの倍数は次のようになります。

<tr><td>Which car brand(s) do you like?</td><td>
<select multiple name="CarBrandPref[]">
   <option  value="BMW"             > BMW</option>
   <option  value="Ford"            > Ford</option>
   <option  value="Mercedes"        > Mercedes </option>
   <option  value="GMC"             > GMC</option>
   <option  value="Volkswagen"      > Volkswagen </option>
   <option  value="Toyota"          > Toyota </option>
   <option  value="Audi"            > Audi </option>
</select>
</td></tr>

プロファイル テーブルのレイアウトは次のようになります。

 Id     Name            CarbrandPref
--------------------------------------------------------
 1      Mike            bmw,volkswagen,mercedes
 2      Paul            Mercedes, ford, GMC
 3      Axel            GMC, ford, toyota, audi
 4      John            ford, bmw

ユーザー B は、検索条件として「bmw and mercedes」を指定します。クエリは 3 行を返します。

Id     Name            CarbrandPref
---------------------------------------------------------
1      Mike            bmw,volkswagen,mercedes
2      Paul            Mercedes, ford, GMC
4      John            ford, bmw

これを機能させるためにSOや他のサイトを検索したところ、これ(dbの配列に保存すること)はパフォーマンスに悪いなどと誰もが言っていることに気づきました。さらに、mysqlの配列を介して選択検索を機能させることができません.

だから今、私は何をすべきか途方に暮れています。可能な自動車ブランドごとに列を追加したくありませんが、他に何をすればよいですか? これで私を助けることができる人はいますか?どんなアイデアでも大歓迎です!

これが誰かが私を助けるのに十分明確であることを願っています。そうでない場合は、お知らせください。要求された情報を追加します。

これらのリンクを使用して、ドロップダウン ボックスに入力された配列を mysql データベースに保存できるようにしました。

http://www.aleixcortadellas.com/main/2009/03/20/492/

http://toolspot.org/how-to-store-array-mysql.php

4

2 に答える 2

2

3 つの選択肢があります。

1つ目は、あなたが1つであるパスをたどり、2つのカンマ区切りのリストを比較しようとすることです. これにより、本当に醜い SQL が生成されます。インデックスは許可されません。基本的な考え方は次のようなものです。

where find_in_set(substring_index(@list, ',', 1), CarBrands) > 0 or
      find_in_set(substring_index(substring_index(@list, ',', 2), ',', -1), CarBrands) > 0 or
      . . .

2 つ目は、新しいテーブルを導入することです。このテーブルには、ユーザー用の 1 つの行とお気に入りのものがあります。これを一般化して、ユーザー用の列、カテゴリ (「CarBrand」) 用の列、および名前があるようにします。次に、クエリは次のようになります。

from Profile p left outer join
     Favorites f
     on p.userId = f.userId and f.Category = 'CarBrand'
group by p.userId
having sum(f.Name = 'Mercedes') > 0 and
       sum(f.Name = 'BMW') > 0;

3 番目のオプションは、全文検索とmatch関数を使用することです。ドキュメントはこちらです。

私の推測では、全文索引はおそらく、あなたが望むことを行うための最も簡単な方法です。

編集:

全文索引とオプション 2 に関するクエリ。おそらく重要な質問は、ストップ ワードと短い用語に関するものです。たとえば、全文索引は 4 文字未満の単語を削除します (デフォルトでは、これらの両方を変更できます)。ストップワードのリストもあります。

私の個人的な傾向は、2 番目のオプションを使用することです。しかし、その理由は良いものではないかもしれません。標準の SQL を使用しており、データ構造とクエリに慣れています。そのため、結果をより細かく制御できます。

あなたの場合、全文検索はおそらく迅速に実装する方が簡単で、同じかそれ以上の速度になる可能性が非常に高いです。全文検索では、"AND" と "OR" を組み合わせたり、自然言語検索を行って関連値を取得したりするなど、より複雑なブール演算も実行できます。

于 2013-08-11T15:48:37.357 に答える
1

ユーザーと車のブランドをマッピングするには、3 番目のテーブルを使用する必要があります。このテーブルには、2 つの列をカバーする主キーがあり、それぞれが他の 2 つのテーブルのいずれかに対する外部キーです。「バスティアン」と「BMW」の間のこのテーブル マッピングの行の存在は、彼がそのブランドを選択したことを意味します。このような行がないということは、関連付けが存在しないことを意味します。

より具体的には、テーブル 1 にはユーザーがあり、テーブル 2 には自動車のブランドがあります。それらのそれぞれには、ID # を持つ主キー列があります。3 番目の表は、これら 2 つを結び付けています。MySQL の多対多の関係と、こちらこちらを参照してください。

于 2013-08-11T16:01:07.507 に答える