通过SQL查询具有特定于酒店应用偏好的房间

时间:2018-08-30 21:31:20

标签: mysql sql

我有下表:

房间:

room_id | room_name | ... 
1       |  regular  | ...
2       |  suite    | ...
          . 

首选项:

pref_id | pref_kind | ... 
1       |  wi-fi    | ...
2       |  view     | ...
.

房间和偏好设置:

room_id | pref_id  
1       |  1  
1       |  2 
2       |  1  
4       |  4  
4       |  3  
5       |  4   
6       |  1 
     .

例如room_1有2个首选项,room_2只有1个首选项,room_3没有首选项,依此类推。

用户选择首选项,我想显示包含它们的房间。例如:

  • 如果用户不希望使用偏好,我希望显示为room_3。
  • 如果用户希望使用“ preference_1”我要显示为room_2,即room_6。
  • 如果用户希望使用“ preference_1”,“ preference_2”,而我想在room_1中显示。

假设我具有必需的preferences_id,并且要显示表Rooms_and_preferences中的room_id,那么对此的SQL查询是什么?

我已经尝试过此代码,但无法按我的意愿工作:

SELECT room_id
FROM Rooms_and_preferences
where pref_id in ( . , . , ...)
GROUP BY room_id
HAVING COUNT(DISTINCT pref_id) = *number of list

1 个答案:

答案 0 :(得分:1)

如果您希望完全与首选项匹配,那么这会比较棘手:

SELECT r.room_id
FROM rooms r LEFT JOIN
     Rooms_and_preferences rp
     ON r.room_id = rp.room_id 
GROUP BY r.room_id
HAVING SUM( rp.pref_id IN ( . , . , ...) ) = *number of list* AND
       COUNT(*) = *number of list*;

LEFT JOIN确保包含无偏好的房间。第一个HAVING条件确保该会议室包括所有匹配的首选项(假定没有重复项)。第二个HAVING条件确保没有其他条件。