我有一个房地产网站,人们可以在其中基于位置,属性类型和生成器搜索属性。
我有一个像下面的表格。
创建表项目(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/