繁体   English   中英

用于搜索引擎的SQL查询(PHP / MySQL)

[英]SQL query for search engine (PHP/MySQL)

我正在为我的Web项目(PHP / MySQL)开发一个搜索引擎。 用户应能够在一定条件下找到酒店

  1. 位置
  2. 设备
  3. 语言能力

表格如下

  1. tblHotels * hotel_id * PK hotel_name
  2. tblLocations * location_id * PK location_name
  3. tblFacilities * facility_id * PK设施名称
  4. tblLanguages * language_id * PK语言名称
  5. tblHotelLocations * location_id * FK * hotel_id * FK
  6. tblHotelFacilities * facility_id * FK * hotel_id * FK
  7. tblHotelLanguages * language_id * FK * hotel_id * FK

例如,用户想要搜索位于旧金山(* location_id *)的酒店,并提供免费Wi-Fi(* facility_id *)和游泳池(* facility_id *),工作人员会讲英语(* language_id *)和西班牙语(* language_id * )

显然,用户可以更改搜索条件,例如在设施中添加早餐或在语言中添加德语。 在这种情况下,搜索结果应反映所有条件均满足的酒店。

否则他可能没有选择任何设施(语言等),在这种情况下,只应退回根本没有任何设施的酒店。

是否可以通过一个查询来完成? 我非常确定它是并与INNER JOINs建立了联系。 但是我只是被困住了:(有什么线索吗?

提前致谢!

更新:附加数据库模式

/*
-- 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,'');
Select *
from tbHotels h, tblFacilities f, tblHotelFacilities hf
where f.facilitiesName IN (?,?,?) AND hf.facilityId = f.id 
AND hf.hotelId = h.id

这是对设施的查询,您可以添加位置和语言。

可以这样添加?

假设您有一个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++;
   }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM