2012-11-06 31 views
1

我有一個房地產網站,人們可以根據位置,物業類型和建築商搜索物業。從where子句刪除參數以顯示記錄

我有一個如下表。

 

CREATE TABLE Project(ProjectId INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
        Location VARCHAR(255), 
        PropertyType VARCHAR(255), 
        Builder VARCHAR(255), 
        ProjectName VARCHAR(255), 
        Status TINYINT) 


INSERT INTO Project(Location, PropertyType, Builder, ProjectName) 
      VALUES('Location A', 'Flats',  'Builder A', 'Project A', 1), 
        ('Location A', 'Villas', 'Builder B', 'Project B', 1), 
        ('Location B', 'Flats',  'Builder A', 'Project C', 1), 
        ('Location C', 'Villas', 'Builder C', 'Project D', 1), 
        ('Location B', 'Plots',  'Builder B', 'Project E', 1), 
        ('Location A', 'Row House', 'Builder C', 'Project F', 1), 
        ('Location A', 'Plots',  'Builder A', 'Project G', 1), 
        ('Location C', 'Plots',  'Builder C', 'Project H', 1), 
        ('Location C', 'Flats',  'Builder B', 'Project I', 1), 
        ('Location C', 'Villas', 'Builder B', 'Project J', 1), 
        ('Location A', 'Villas', 'Builder A', 'Project K', 1), 
        ('Location C', 'Flats',  'Builder B', 'Project L', 1); 

我使用的搜索過程是這樣一種方式,按照所給參數,他們選擇即物業類型,位置,構建名稱

現在有可能是項目的一些搜索它帶回的搜索結果參數如下位置C處

平底鞋由生成器

我想改變的過程以這樣的方式在where子句應該改變濾波器的參數考慮其他的可能性LIK帶來的結果所有的時間e計算在位置C中的上述

公寓由助洗劑

有在位置C處沒有公寓由助洗劑,所以應該由其他助洗劑

 

     Location C Flats  Builder B Project I 

過濾器應在位置C處顯示公寓考慮屬性類型,位置和構建名稱

別墅在位置B處

沒有別墅在位置B上

 

Location A Villas Builder B Project B 
Location C Villas Builder B Project J 
Location A Villas Builder A Project K 

搜索應由

 

     PropertyType -> Location -> Builder 

如果在該位置沒有項目特定生成器發生那麼

 

     PropertyType -> Location 

如果沒有項目的特定地點,然後

 

     PropertyType 

該p過濾器中的參數應該以這樣一種方式消除,它會爲搜索參數帶來類似的結果。

 

     PropertyType -> Location -> Builder  No Records 
     PropertyType -> Location     No Records 
     PropertyType        Records Found 

我創建的過程爲

 

    DROP PROCEDURE IF EXISTS getProjectResult; 
    CREATE PROCEDURE getProjectResult(IN PropertyType VARCHAR(255), IN Location VARCHAR(255), IN BuilderName VARCHAR(255)) 
    BEGIN 
     SET @strSQL = 'SELECT * 
         FROM project 
         WHERE status = 1 '; 

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

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

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

     PREPARE stmt FROM @strSQL; 
     EXECUTE stmt; 
     DEALLOCATE PREPARE stmt; 
    END; 

所以我的做法會帶來輸出如下

 

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

無輸出

所以應該顯示

 

     Location C Flats  Builder B Project L 

如何通過這種方式更改過程,從過濾器中刪除參數以便帶來結果。 應按以下順序構建器,位置和屬性類型刪除參數。

房產類型應給予最高優先其次位置和建設者的名字

謝謝回覆

回答

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等文本工具中進行部署搜索。
0

阿蓮柯林斯是正確的,但如果你是不是想找性能方面: 那麼簡單回答你的問題是:

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 ='''[email protected]+''' ' + @wherequery+ ')' 
    END 

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

END 
+0

謝謝回覆。任何方式如何從where子句中刪除參數,以便我可能獲得records.you添加或生成器,但如果我沒有在該特定位置的屬性類型 – ArrayOutOfBound

+0

,你可以做同樣的位置和屬性類型.. 通過添加或像 SET @wherequery + ='or(Location ='''+ @ Location +'''和PropertyType ='+ @ PropertyType +')' – Rusty

+0

我想我的問題並不清楚。即使我提供了三個參數,可能有也可能不是所提供參數的記錄。因此,如果我提供CALL getProjectResult('Villas','Location C','Builder A'),參數不是空的,但它可能會也可能不會有記錄匹配參數 – ArrayOutOfBound