SQL-запрос для номеров с конкретными настройками для гостиничного приложения - PullRequest
0 голосов
/ 31 августа 2018

У меня есть следующие таблицы:

Номер:

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

Параметры:

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

Rooms_and_preferences:

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_ids и я хочу отобразить room_ids из таблицы Rooms_and_preferences. Что такое 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 голосов
/ 31 августа 2018

Если вы хотите, чтобы точное соответствовало предпочтениям, то это сложнее:

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 гарантирует отсутствие дополнительных условий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...