2011-11-02 147 views
2

我正在爲我的web項目(PHP/MySQL)開發搜索引擎。 用戶應該能夠通過一定的條件下搜索引擎的SQL查詢(PHP/MySQL)

  1. 位置找到一家酒店
  2. 設施
  3. 語言

表是如下

  1. tblHotels * HOTEL_ID * PK hotel_name
  2. tblLocations * LOCATION_ID * PK LOCATION_NAME
  3. tblFacilities * facility_id * PK facility_name
  4. tblLanguages * LANGUAGE_ID * PK LANGUAGE_NAME
  5. tblHotelLocations * LOCATION_ID * FK * HOTEL_ID * FK
  6. tbl酒店設施 * facility_id * FK 個* HOTEL_ID * FK
  7. tblHotelLanguages * LANGUAGE_ID * FK * HOTEL_ID * FK

例如用戶想搜索的酒店,位於舊金山(* LOCATION_ID *) 配有免費的Wi- (* facility_id *)和Pool(* facility_id *) 工作人員會說英語(* language_id *)和西班牙語(* language_id *)

顯然,用戶可能會更改搜索條件,例如將早餐添加到設施或德語語言。 在這種情況下,搜索結果應該反映所有條件都成立的酒店。

或者他可能不會選擇任何設施(語言等),在這種情況下,只有沒有設施的酒店應該退回。

可以用一個查詢來做到嗎?我很確定它是以及以某種方式與INNER JOIN連接。但我只是停留:(任何線索事先

感謝

更新:?!DB模式連接

/* 
-- Query: desc tblHotels 
-- Date: 2011-11-02 09:37 
*/ 

INSERT INTO `tblhotels` (`Field`,`Type`,`Null`,`Key`,`Default`,`Extra`) VALUES ('hotel_id','int(11)','NO','PRI',NULL,'auto_increment'); 

INSERT INTO `tblhotels` (`Field`,`Type`,`Null`,`Key`,`Default`,`Extra`) VALUES ('hotel_name','varchar(45)','YES','UNI',NULL,''); 


/* 
-- Query: desc tblFacilities 
-- Date: 2011-11-02 09:37 
*/ 

INSERT INTO `tblfacilities` (`Field`,`Type`,`Null`,`Key`,`Default`,`Extra`) VALUES ('facility_id','int(11)','NO','PRI',NULL,'auto_increment'); 

INSERT INTO `tblfacilities` (`Field`,`Type`,`Null`,`Key`,`Default`,`Extra`) VALUES ('facility_name','varchar(45)','YES','UNI',NULL,''); 

/* 
-- Query: desc tblLocations 
-- Date: 2011-11-02 09:37 
*/ 

INSERT INTO `tbllocations` (`Field`,`Type`,`Null`,`Key`,`Default`,`Extra`) VALUES ('location_id','int(11)','NO','PRI',NULL,'auto_increment'); 

INSERT INTO `tbllocations` (`Field`,`Type`,`Null`,`Key`,`Default`,`Extra`) VALUES ('location_name','varchar(45)','YES','UNI',NULL,''); 


/* 
-- Query: desc tblLanguages 
-- Date: 2011-11-02 09:37 
*/ 

INSERT INTO `tbllanguages` (`Field`,`Type`,`Null`,`Key`,`Default`,`Extra`) VALUES ('language_id','int(11)','NO','PRI',NULL,'auto_increment'); 

INSERT INTO `tbllanguages` (`Field`,`Type`,`Null`,`Key`,`Default`,`Extra`) VALUES ('language_name','varchar(45)','YES','UNI',NULL,''); 


/* 
-- Query: desc tblHotelFacilities 
-- Date: 2011-11-02 09:39 
*/ 

INSERT INTO `tblhotelfacilities` (`Field`,`Type`,`Null`,`Key`,`Default`,`Extra`) VALUES ('tblHotelFacilities_id','int(11)','NO','PRI',NULL,'auto_increment'); 

INSERT INTO `tblhotelfacilities` (`Field`,`Type`,`Null`,`Key`,`Default`,`Extra`) VALUES ('facility_id','int(11)','YES','',NULL,''); 

INSERT INTO `tblhotelfacilities` (`Field`,`Type`,`Null`,`Key`,`Default`,`Extra`) VALUES ('hotel_id','int(11)','YES','',NULL,''); 


/* 
-- Query: desc tblHotelLocations 
-- Date: 2011-11-02 09:39 
*/ 

INSERT INTO `tblhotellocations` (`Field`,`Type`,`Null`,`Key`,`Default`,`Extra`) VALUES ('tblHotelLocations_id','int(11)','NO','PRI',NULL,'auto_increment'); 

INSERT INTO `tblhotellocations` (`Field`,`Type`,`Null`,`Key`,`Default`,`Extra`) VALUES ('location_id','int(11)','YES','',NULL,''); 

INSERT INTO `tblhotellocations` (`Field`,`Type`,`Null`,`Key`,`Default`,`Extra`) VALUES ('hotel_id','int(11)','YES','',NULL,''); 


/* 
-- Query: desc tblHotelLanguages 
-- Date: 2011-11-02 09:39 
*/ 

INSERT INTO `tblhotelanguages` (`Field`,`Type`,`Null`,`Key`,`Default`,`Extra`) VALUES ('tblHotelLanguages_id','int(11)','NO','PRI',NULL,'auto_increment'); 

INSERT INTO `tblhotelanguages` (`Field`,`Type`,`Null`,`Key`,`Default`,`Extra`) VALUES ('language_id','int(11)','YES','',NULL,''); 

INSERT INTO `tblhotelanguages` (`Field`,`Type`,`Null`,`Key`,`Default`,`Extra`) VALUES ('hotel_id','int(11)','YES','',NULL,''); 
+0

您有數據庫模式嗎? –

+0

我使用這個「AND f.hotelId = hf.hotelId」將db模式附加到了我的問題 – paulus

回答

0
Select * 
from tbHotels h, tblFacilities f, tblHotelFacilities hf 
where f.facilitiesName IN (?,?,?) AND hf.facilityId = f.id 
AND hf.hotelId = h.id 

這是唯一的設施查詢,U可以添加地點和語言......

?可以像這樣添加,

假設你有一個ArrayList包含用戶輸入的設施名稱。

String query = " Select * " + 
"from tbHotels h, tblFacilities f, tblHotelFacilities hf"+ 
"where f.facilitiesName IN <facilities> AND hf.facilityId = f.id "+ 
"AND f.hotelId = hf.hotelId"; 

String x = ""; 
int length = ArrayListOfFacilityNames.length(); 
while(length>0) { 
    x=x+"?, "; 
    length = length-1; 
} 
//remove last "," from string x 

x=x.substring(0, x.length -1); 

    //paste this string of facilities in main query 

    query = query.replace("<facilities>",x); 

    // now ur query contains number of question marks equivalent to number of facilities  entered by user 

    //make prepares statement with String query 

    Iterator fnames = ArrayListOfFacilitiesNames.Iterator(); 
    int i=0; 
    while(fnames.hasNext()) 
    { 
    String name = fname.next(); 
    preparesStatement.setString(i,name) 
    i++; 
    } 
+0

- facility table中沒有hotel_id字段。基本上設施表是一個參考表,包含ID和名稱。它通過tblHotelFacilities與酒店表相交。 – paulus

+0

這是一個錯誤,糾正..... 和對不起,因爲我有mentiod在Java代碼...我的錯誤! @paulus – Zohaib

+0

@paulus corrected .. – Zohaib