我有下表:
房间:
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没有首选项,依此类推。
用户选择首选项,我想显示包含它们的房间。例如:
假设我具有必需的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
答案 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
条件确保没有其他条件。