Mysql — как сделать запрос для отбора по наличию опций к двум таблицам?
Суть следующая - есть отели в базе, у них есть опции(интернет, парковка и так далее).
Вот, нужно из базы получить отели содержащие определенные опции - например те же интернет и парковку.
опции каждая имеет свой уникальный id. отели хранятся в одной базе(ид отеля, имя отеля, опции через запятую ) + так же те же опции хранятся в отдельной базе (ид опции, ид отеля).
собственно задача - сделать выборку из отельной базы где у отелей есть определенные опции.
представляю как просто запрос сразу к двум таблицам идет, тут для меня ничего сложного. но тут получается к одной записи из отелей относятся несколько записей из таблицы опций и как этим оперировать еще не научился.
дублирование хранения через запятую сделал для экономии запросов при показе конкретного отеля.
Вам нужно уволить проектировщика БД (а в случае, если это вы, больше так не делать) и нормализовать свою структуру БД до 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(...)
@Richard_Ferlow приведенный мною запрос служил бы для вывода списка названий отелей с конкретными опциями. отредактировал запрос, чтобы быть точным. что касается первого вашего вопроса - то плохо то, что таблицы не нормализованы. чем это плохо? например тем, что данные занимают больше места, чем могли бы. тем, что код поддерживать сложнее. потенциальные баги. в общем нормализация - важная штука, не зря ее придумали.
@Richard_Ferlow необходимо прочитать про нормализацию данных при проектировании. Суть баз данных как раз избавляться от повторения использования одни и тех же данных - чтобы они не дублировались. А повторно использовались существующие. Прочитай про нормальные формы.
Поддерживаю @Aliance. Вам определённо нужно уволить проектировщика БД ;)
Теперь выхода 2:
1) Нормализовать структуру и делать более логичные, лёгкие и простые запросы.
2) Делать выборку по регулярке или полнотекстовому поиску. А чтобы выборка происходила быстрее нужно сделать функциональные индексы на популярные опции.