php - 搜索引擎的 SQL 查询 (PHP/MySQL)

标签 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. 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*)

显然,用户可以更改搜索条件,例如将早餐添加到设施中或将德语添加到语言中。 在这种情况下,搜索结果应反射(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/

相关文章:

php - 如何声明函数的日期特定值

php - 如何根据类别获取多条记录

c# - 如何使用 Linq to SQL 根据另一个表的前 1 个 ID 进行连接?

MySQL 存储过程分隔符错误

java - 在android中使用volley发送json数组将mysql中的多条记录添加到php脚本

php - 如何在我的 crontab 中使用查询字符串?

php - 如何从父类函数访问子类中定义的常量?

c# - 添加新记录时如何启动外键?

mysql - 如何获取表的 mysql 上次更新/删除/插入日期时间?

sql - Sublime Text 2 中的 Microsoft SQL Server?