@Richard_Ferlow
Веб-программист

Mysql — как сделать запрос для отбора по наличию опций к двум таблицам?

Суть следующая - есть отели в базе, у них есть опции(интернет, парковка и так далее).

Вот, нужно из базы получить отели содержащие определенные опции - например те же интернет и парковку.

опции каждая имеет свой уникальный id. отели хранятся в одной базе(ид отеля, имя отеля, опции через запятую ) + так же те же опции хранятся в отдельной базе (ид опции, ид отеля).

собственно задача - сделать выборку из отельной базы где у отелей есть определенные опции.

представляю как просто запрос сразу к двум таблицам идет, тут для меня ничего сложного. но тут получается к одной записи из отелей относятся несколько записей из таблицы опций и как этим оперировать еще не научился.

дублирование хранения через запятую сделал для экономии запросов при показе конкретного отеля.
  • Вопрос задан
  • 2389 просмотров
Решения вопроса 1
опции через запятую

Вам нужно уволить проектировщика БД (а в случае, если это вы, больше так не делать) и нормализовать свою структуру БД до 3НФ, правильно реализовав связь многие-ко-многим.

В итоге должно получится следующее:
hotel (id, title)
option (id, title)
hotel_option (hotel_id, option_id)

Тогда бы запрос выглядел так:
SELECT DISTINCT `title` FROM `hotel`
LEFT JOIN `hotel_option` ON `id` = `hotel_id`
WHERE `option_id` IN(...)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
zBit
@zBit
Full stack web developer
опции через запятую
Поддерживаю @Aliance. Вам определённо нужно уволить проектировщика БД ;)

Теперь выхода 2:
1) Нормализовать структуру и делать более логичные, лёгкие и простые запросы.
2) Делать выборку по регулярке или полнотекстовому поиску. А чтобы выборка происходила быстрее нужно сделать функциональные индексы на популярные опции.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы