1

ユーザーがプロパティを検索する検索フォームを持っているとしましょう。彼が選択したとしましょう:

場所:ABC
価格帯 : 100万~500万
ベッドルーム数の範囲 : 5 - 12
州 : XYZ
郡 : PQR
カテゴリー: MNO

データベースから結果を得るために選択したすべてのフィールドが一致する可能性はほとんどありません。ANDそのため、ここではin conditionを使用しWHEREても効果がないようです。私が欲しいのは -

  1. すべての選択が一致した場合、問題なく結果が表示されます
  2. 場所、価格帯、州が一致した場合は、結果も表示します
  3. 場所、寝室の数、カテゴリ、州が一致した場合は、結果も表示します
  4. など....いずれかの組み合わせが一致する場合は、結果を表示します
4

3 に答える 3

4

任意の検索用語に一致するレコードのテーブルをフィルター処理し、一致する用語の数の降順で結果を並べ替えます。

SELECT   *,
         (Location = 'ABC')
       + (Price BETWEEN 1000000 AND 5000000)
       + (Bedrooms BETWEEN 5 AND 12)
       + (State = 'XYZ')
       + (County = 'PQR')
       + (Category = 'MNO')
           AS relevance
FROM     my_table
WHERE    (Location = 'ABC')
      OR (Price BETWEEN 1000000 AND 5000000)
      OR (Bedrooms BETWEEN 5 AND 12)
      OR (State = 'XYZ')
      OR (County = 'PQR')
      OR (Category = 'MNO')
HAVING   relevance >= ?   -- specify the minimum number of matching terms here
ORDER BY relevance DESC
LIMIT    ?                -- specify the maximum number of matching records here
于 2012-10-12T15:37:59.033 に答える
3

WHERE 句で多数の条件を作成する必要があります

WHERE (Location AND price AND Bedrooms AND State AND County AND Category)
OR (Location AND Price AND State)
OR (Location AND Bedrooms AND Category AND State)
OR (...)
...

これにより、データを返すために有効にしたいデータの任意の組み合わせが可能になります。

于 2012-10-12T15:33:59.723 に答える
2

Eggyals ソリューションに似ていますが、関心のある行を戻すだけです。テストされていないため、タイプミスがある場合はご容赦ください:-

SELECT Sub2.*
FROM (SELECT MAX(
CASE WHEN Location = 'ABC' THEN 1 ELSE 0 END +
CASE WHEN Price BETWEEN 1000000 AND 5000000 THEN 1 ELSE 0 END +
CASE WHEN Bedrooms BETWEEN 5 AND 12 THEN 1 ELSE 0 END +
CASE WHEN State = 'XYZ' THEN 1 ELSE 0 END +
CASE WHEN County = 'PQR' THEN 1 ELSE 0 END +
CASE WHEN Category = 'MNO' THEN 1 ELSE 0 END) AS MatchCount
FROM     my_table a
WHERE    (Location = 'ABC')
      OR (Price BETWEEN 1000000 AND 5000000)
      OR (Bedrooms BETWEEN 5 AND 12)
      OR (State = 'XYZ')
      OR (County = 'PQR')
      OR (Category = 'MNO'))Sub1
INNER JOIN (SELECT a.*,
CASE WHEN Location = 'ABC' THEN 1 ELSE 0 END +
CASE WHEN Price BETWEEN 1000000 AND 5000000 THEN 1 ELSE 0 END +
CASE WHEN Bedrooms BETWEEN 5 AND 12 THEN 1 ELSE 0 END +
CASE WHEN State = 'XYZ' THEN 1 ELSE 0 END +
CASE WHEN County = 'PQR' THEN 1 ELSE 0 END +
CASE WHEN Category = 'MNO' THEN 1 ELSE 0 END AS MatchCount
FROM     my_table a
WHERE    (Location = 'ABC')
      OR (Price BETWEEN 1000000 AND 5000000)
      OR (Bedrooms BETWEEN 5 AND 12)
      OR (State = 'XYZ')
      OR (County = 'PQR')
      OR (Category = 'MNO')) Sub2
ON Sub1.MatchCount = Sub2.MatchCount
于 2012-10-12T15:51:00.620 に答える