我正在为我的网络项目 (PHP/MySQL) 开发一个搜索引擎。 用户应该能够通过特定条件找到酒店
- 地点
- 设施
- 语言
表格如下
- tblHotels *hotel_id* PK hotel_name
- tblLocations *location_id* PK location_name
- tblFacilities *facility_id* PK facility_name
- tblLanguages *language_id* PK language_name
- tblHotelLocations *location_id* FK *hotel_id* FK
- tblHotelFacilities *facility_id* FK *hotel_id* FK
- tblHotelLanguages *language_id* FK *hotel_id* FK
例如,用户想要搜索位于旧金山 (*location_id*) 的酒店 免费 Wi-Fi (*facility_id*) 和泳池 (*facility_id*) 工作人员会说英语 (*language_id*) 和西类牙语 (*language_id*)
显然,用户可以更改搜索条件,例如将早餐添加到设施中或将德语添加到语言中。 在这种情况下,搜索结果应反射(reflect)所有条件均成立的酒店。
或者他可能不选择任何设施(语言等),在这种情况下,只应返回根本没有设施的酒店。
是否可以通过一个查询来完成?我很确定它与 INNER JOIN 有某种联系。但我只是卡住了 :( 有什么线索吗?
提前致谢!
更新:附加数据库架构
/*
-- 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++;
}
关于php - 搜索引擎的 SQL 查询 (PHP/MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7975024/