1

私は、場所、物件の種類、建築業者に基づいて物件を検索できる不動産の Web サイトを持っています。

以下のようなテーブルがあります。

CREATE TABLE Project(ProjectId INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
                     場所 VARCHAR(255)、
                     PropertyType VARCHAR(255),
                     ビルダー VARCHAR(255)、
                     プロジェクト名 VARCHAR(255),
                     ステータス TINYINT)


INSERT INTO Project(場所、PropertyType、Builder、ProjectName)
             VALUES('ロケーション A', 'フラット', 'ビルダー A', 'プロジェクト A', 1),
                   (「ロケーション A」、「ヴィラ」、「ビルダー B」、「プロジェクト B」、1)、
                   (「ロケーション B」、「フラット」、「ビルダー A」、「プロジェクト C」、1)、
                   (「ロケーション C」、「ヴィラ」、「ビルダー C」、「プロジェクト D」、1)、
                   ('ロケーション B', 'プロット', 'ビルダー B', 'プロジェクト E', 1),
                   (「ロケーション A」、「長屋」、「ビルダー C」、「プロジェクト F」、1)、
                   ('場所 A', 'プロット', 'ビルダー A', 'プロジェクト G', 1),
                   ('ロケーション C', 'プロット', 'ビルダー C', 'プロジェクト H', 1),
                   ('ロケーション C', 'アパート', 'ビルダー B', 'プロジェクト I', 1),
                   (「ロケーション C」、「ヴィラ」、「ビルダー B」、「プロジェクト J」、1)、
                   (「ロケーション A」、「ヴィラ」、「ビルダー A」、「プロジェクト K」、1)、
                   ('ロケーション C', 'フラット', 'ビルダー B', 'プロジェクト L', 1);

私が使用する検索手順は、彼らが選択したパラメータ、つまりプロパティタイプ、場所、ビルダー名に従って検索結果を返すような方法です

以下のように、いくつかの検索パラメータのプロジェクトがあるかもしれません

ロケーション C のビルダー A によるフラット

上記のような他の可能性を考慮して、where句のフィルターのパラメーターを変更して常に結果をもたらすように手順を変更したい

ロケーション C のビルダー A によるフラット

場所 C にはビルダー A のアパートがないため、他のビルダーによる場所 C のアパートを表示する必要があります。

      場所 C アパートビルダー B プロジェクト I

フィルターは、PropertyType、場所、ビルダー名を考慮する必要があります

ロケーション B のヴィラ

ロケーション B にはヴィラがないため、

ロケーション A ヴィラ ビルダー B プロジェクト B
ロケーション C ヴィラ ビルダー B プロジェクト J
ロケーション A ヴィラ ビルダー A プロジェクト K

検索は

       PropertyType -> 場所 -> ビルダー

その場所に特定のビルダーのプロジェクトがない場合

       PropertyType -> 場所

特定の場所にプロジェクトがない場合

       プロパティタイプ

フィルターのパラメーターは、検索パラメーターに同様の結果をもたらすような方法で削除する必要があります。

       PropertyType -> Location -> Builder No Records
       PropertyType -> 場所 レコードなし
       PropertyType レコードが見つかりました

私が作成した手順は以下の通りです

    存在する場合は手順を削除 getProjectResult;
    CREATE PROCEDURE getProjectResult(IN PropertyType VARCHAR(255), IN Location VARCHAR(255), IN BuilderName VARCHAR(255))
    始める
      SET @strSQL = 'SELECT *
                       FROM プロジェクト
                      WHERE ステータス = 1 ';

      IF PropertyType != '' THEN
        SET @strSQL = CONCAT(@strSQL, ' AND PropertyType ="', PropertyType, '" ');
      END IF;

      IF 場所 != '' THEN    
        SET @strSQL = CONCAT(@strSQL, ' AND 場所 ="', 場所, '" ');
      END IF;

      IF BuilderName != '' THEN
        SET @strSQL = CONCAT(@strSQL, ' AND Builder ="', BuilderName, '" ');
      END IF;

      PREPARE stmt FROM @strSQL;
      EXECUTE ステートメント;  
      DEALLOCATE PREPARE stmt;
    終わり;

だから私の手順は以下のように出力をもたらすつもりです

     CALL getProjectResult('Flats', 'Location C', 'Builder A');

出力なし

したがって、表示されるはずです

       場所 C アパート ビルダー B プロジェクト L  

結果をもたらすようにフィルターからパラメーターを削除するように手順を変更する方法。パラメータは、ビルダー、場所、プロパティ タイプの順に削除する必要があります。

プロパティの種類は、場所とビルダー名の後に優先順位を高くする必要があります

返信ありがとう

4

2 に答える 2

0

累積スコアを使用して、このようなクエリを実行するのが好きです。たとえば、次のようになります。

 select project_id,
   case when location = ? then 1 else 0 end +
   case when flats = ? then 1 else 0 end + 
   case when builder = ? then 1 else 0 end as score
from project
order by score desc

このメカニズムを使用して、それらに異なる重みを付けることもできることに注意してください(ビルダーなどよりも場所が重要な場合があります)。

そして、あなたが求めていないいくつかの情報:

  • たとえば、データを繰り返さないなど、スキーマを正規化する必要があります。
  • solr などのテキスト ツールでフィールド検索を実行することもできます。
于 2012-11-06T06:35:56.847 に答える
0

Alian Colins は正しいですが、パフォーマンス面を探していない場合は、質問に対する簡単な答えは次のとおりです。

Alter PROCEDURE getProjectResult  
(@PropertyType as VARCHAR(255), @Location as VARCHAR(255), @BuilderName as VARCHAR(255))
as
BEGIN
  declare @strSQL as varchar(max)
  declare @wherequery as varchar(max)
  SET @strSQL = 'SELECT * 
                   FROM project
                  WHERE status = 1 ';
    set @wherequery = ''
  IF @PropertyType <> '' 
  begin
    SET @wherequery += ' AND (PropertyType ='''+ @PropertyType+ ''' '
  END

  IF @Location <> '' 
  begin
    SET @wherequery += ' AND Location ='''+ @Location+ ''' )'
  END

  IF @BuilderName <> ''
  begin
    SET @wherequery += ' or( Builder ='''+@BuilderName+'''    ' + @wherequery+ ')'
  END

set @strSQL = @strSQL + @wherequery
print @strSQL
  exec(@strSQL)

END
于 2012-11-06T06:42:21.607 に答える