dongxia1390 2011-11-02 02:00
浏览 56
已采纳

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

I'm developing a search engine for my web project (PHP/MySQL). User should be able to find a hotel by certain conditions

  1. Location
  2. Facilities
  3. Languages

tables are as following

  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

For example user wants to search for hotel, located in San Francisco (*location_id*) with Free Wi-Fi (*facility_id*) and Pool (*facility_id*) where staff speaks English (*language_id*) and Spanish (*language_id*)

Obviously, user may change search conditions, like adding Breakfast to facilities or German to languages. In this case, search results should reflect hotels, where all conditions are true.

Or he may not pick any facilities (languages etc), in this case, only hotels with no facilities at all should be returned.

Is it possible to do it with one query? I'm pretty sure it is and somehow connected with INNER JOINs. But i'm just stuck :( Any clue?

Thanks in advance!

UPDATE: DB Schema attached

/*
-- 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,'');
  • 写回答

1条回答 默认 最新

  • dongliao6777 2011-11-02 02:46
    关注
    Select *
    from tbHotels h, tblFacilities f, tblHotelFacilities hf
    where f.facilitiesName IN (?,?,?) AND hf.facilityId = f.id 
    AND hf.hotelId = h.id
    

    This is a query for only facilities, u can add locations and languages....

    ?'s can be added like this,

    assuming u have an ArrayList containing names of facilities entered by user.

    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++;
       }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 个人网站被恶意大量访问,怎么办
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥15 GDI处理通道视频时总是带有白色锯齿
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制