[英]SQL query for search engine (PHP/MySQL)
我正在为我的Web项目(PHP / MySQL)开发一个搜索引擎。 用户应能够在一定条件下找到酒店
表格如下
例如,用户想要搜索位于旧金山(* 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.