我有一个房地产网站,人们可以在其中基于位置,属性类型和生成器搜索属性。

我有一个像下面的表格。


创建表项目(ProjectId INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
                     位置VARCHAR(255),
                     PropertyType VARCHAR(255),
                     生成器VARCHAR(255),
                     项目名称VARCHAR(255),
                     状态TINYINT)


插入项目(位置,属性类型,生成器,项目名称)
             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);



我使用的搜索过程的方式是,它会根据他们选择的参数(即“属性类型”,“位置”,“建造者名称”)带回搜索结果。

现在可能有一些搜索参数的项目,如下所示

建筑商A在位置C的单位

我想通过这样的方式来更改过程,即通过考虑上述其他可能性,更改where子句中过滤器中的参数以始终带来结果

建筑商A在位置C的单位

建造者A在位置C处没有单位,因此它应在其他建造者在位置C处显示单位


      位置C Flats Builder B Project I



筛选器应考虑PropertyType,位置和构建器名称

位置B的别墅

B位置没有别墅,所以


地点A别墅建造者B项目B
位置C别墅建造者B项目J
位置别墅建造者A项目K



搜索应通过


       PropertyType->位置->生成器



如果在该位置没有针对特定生成器的项目,则


       PropertyType->位置



如果特定位置没有项目,则


       财产种类



过滤器中的参数应以与搜索参数相似的方式消除。


       PropertyType->位置->生成器无记录
       PropertyType->位置无记录
       找到PropertyType记录



我创建的过程如下


    如果存在getProjectResult,则拖放过程;
    创建过程getProjectResult(IN PropertyType VARCHAR(255),IN Location VARCHAR(255),IN BuilderName VARCHAR(255))
    开始
      SET @strSQL ='选择*
                       来自项目
                      WHERE状态= 1';

      如果PropertyType!=''然后
        SET @strSQL = CONCAT(@strSQL,'AND PropertyType =“',PropertyType,'”');
      万一;

      如果位置!=''然后
        SET @strSQL = CONCAT(@strSQL,'AND Location =“',Location,'”');
      万一;

      如果BuilderName!=''然后
        SET @strSQL = CONCAT(@strSQL,'AND Builder =“',BuilderName,'”');
      万一;

      从@strSQL准备stmt;
      执行stmt;
      取消预备stmt;
    结束;



所以我的程序将带来如下输出


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



无输出

所以它应该显示


       地点C单位建造者B项目L



如何更改过程,以这种方式从过滤器中删除参数,从而带来结果。
应在以下顺序构建器,位置和属性类型中删除参数。

位置和建筑商名称之后,应优先考虑属性类型

谢谢您的回复

最佳答案

我喜欢用累积分数来执行类似的查询,例如:

 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之类的文本工具中进行现场搜索。

关于mysql - 从where子句中删除参数以显示记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13245390/

10-16 06:44