У меня такой вопрос: есть таблица отелей с полем, в котором хранятся id параметров через запятую (1,3,8 и т.д.). Есть форма подбора, с помощью которой я передаю массив выбранных id (выбираю checkbox) и соотв-но в скрипт передается список отмеченных id.
Как вывести только те отели, у которых в поле содержатся все передаваемые id из формы подбора. Получилось вроде как такое сделать таким образом
"... field regexp '[[:<:]](1)[[:>:]]' and field regexp '[[:<:]](8)[[:>:]]' ..."
но мне кажется что это что попало.
Заранее спасибо.
Спустя 6 минут, 26 секунд (8.03.2012 - 19:13) Visman написал(а):
SELECT * FROM * WHERE id IN (1,3,8)
где (1,3,8) - строка составленная из принятых из формы данных.
Спустя 3 минуты, 6 секунд (8.03.2012 - 19:16) mirsaytov написал(а):
Проблемка в том, что вместо id используется другое поле, которое содержит данные через запятую, т.е. вот так:
где filters имеет такое содаржание (1,2,3,5,8,10 и т.д.), а не единичный id
SELECT * FROM * WHERE filters IN (1,3,8)
где filters имеет такое содаржание (1,2,3,5,8,10 и т.д.), а не единичный id
Спустя 3 минуты, 16 секунд (8.03.2012 - 19:19) Visman написал(а):
Цитата (mirsaytov @ 9.03.2012 - 00:16) |
где filters имеет такое содаржание (1,2,3,5,8,10 и т.д.) |
Хитрый план какой-то

Тогда пример, чего в таблице содержится, чего приходит из формы и чего надо вывести в результат.
Спустя 15 минут, 37 секунд (8.03.2012 - 19:35) mirsaytov написал(а):
1. Есть таблица отелей, в этой таблице есть поле для записи id фильтров
2. Есть таблица групп фильтров "table_filters_group"
3. Есть таблица для вариантов фильтров "table_filters"
Теперь при добавлении отеля в базу данных, я отмечаю нужные фильтры галочками и записываю их через запятую в поле "filters_ids" и в этом поле идут разные фильтры разных групп (так как id у всех разные, то решил записать все в одно поле).
На сайте теперь нужно вывести точное вхождение, например я отмечаю в форме, что нужно вывести отели с такими то id фильтров.
просто filters_ids regexp '[[:<:]](1,2,5)[[:>:]]' выведет все записи, где есть хоть один фильтр, а нужно, чтобы выводилось точное вхождение, например:
post запрос из формы filters_ids = 1,2,8
и соотв-но нужен селект из базы, где в поле filters_ids содержаться и 1 и 2 и 8, если хоть какого то id там нет, то запись не выводим.
Добился результата запросом вида:
но это нигде не описано в документации (я не встречал), попробовал методом тыка и это заработало, но мне кажется, что такое использовать нельзя.
table_hotels
id (n)
title (название)
filters_ids (1,2,5,8 и т.д.)
2. Есть таблица групп фильтров "table_filters_group"
id (n)
name (название)
3. Есть таблица для вариантов фильтров "table_filters"
id (n)
filter_id (id группы фильтра)
name (название)
Теперь при добавлении отеля в базу данных, я отмечаю нужные фильтры галочками и записываю их через запятую в поле "filters_ids" и в этом поле идут разные фильтры разных групп (так как id у всех разные, то решил записать все в одно поле).
На сайте теперь нужно вывести точное вхождение, например я отмечаю в форме, что нужно вывести отели с такими то id фильтров.
просто filters_ids regexp '[[:<:]](1,2,5)[[:>:]]' выведет все записи, где есть хоть один фильтр, а нужно, чтобы выводилось точное вхождение, например:
post запрос из формы filters_ids = 1,2,8
и соотв-но нужен селект из базы, где в поле filters_ids содержаться и 1 и 2 и 8, если хоть какого то id там нет, то запись не выводим.
Добился результата запросом вида:
SELECT * FROM * WHERE filters regexp '[[:<:]](1)[[:>:]]' and filters regexp '[[:<:]](2)[[:>:]]' and filters regexp '[[:<:]](8)[[:>:]]'
но это нигде не описано в документации (я не встречал), попробовал методом тыка и это заработало, но мне кажется, что такое использовать нельзя.
Спустя 18 минут, 33 секунды (8.03.2012 - 19:53) Visman написал(а):
Записывай в filters_ids последовательность чисел всегда по возрастанию и полное соотвествие можно будет получить условием
UP Или без скобочек, если их в поле не пишешь.
WHERE filters_ids = '(1,2,5)'
UP Или без скобочек, если их в поле не пишешь.
Спустя 14 часов, 33 минуты, 53 секунды (9.03.2012 - 10:27) mirsaytov написал(а):
спасибо за ответы, но
выведет только те записи, где содержится только 1,2,5
меня интересует что-то вроде
(1,2,3,5,8,10) найти в (1,2,3,5,8,10,15,18,19,25)
главное условие, чтобы все цифры левой колонки присутствовали в правой
WHERE filters_ids = '1,2,5'
выведет только те записи, где содержится только 1,2,5
меня интересует что-то вроде
(1,2,3,5,8,10) найти в (1,2,3,5,8,10,15,18,19,25)
главное условие, чтобы все цифры левой колонки присутствовали в правой
Спустя 17 минут, 13 секунд (9.03.2012 - 10:45) Visman написал(а):
Цитата (mirsaytov @ 9.03.2012 - 15:27) |
меня интересует что-то вроде (1,2,3,5,8,10) найти в (1,2,3,5,8,10,15,18,19,25) главное условие, чтобы все цифры левой колонки присутствовали в правой |
Т.е. это получается неполное соответвстие.
Наверное подход к структуре базы нужно менять т.к. запросы с кучей regexp или LIKE через AND будут тупить.
Спустя 3 минуты, 59 секунд (9.03.2012 - 10:49) mirsaytov написал(а):
Цитата |
Наверное подход к структуре базы нужно менять т.к. запросы с кучей regexp или LIKE через AND будут тупить. |
Да, полностью согласен, хотел сделать сложные фильтры с очень простой структурой, буду менять структуру. Спасибо за ответы!
Спустя 6 месяцев, 4 дня, 6 часов, 31 минута, 9 секунд (13.09.2012 - 17:20) Arh написал(а):
Цитата (mirsaytov @ 9.03.2012 - 07:27) |
спасибо за ответы, но WHERE filters_ids = '1,2,5' выведет только те записи, где содержится только 1,2,5 меня интересует что-то вроде (1,2,3,5,8,10) найти в (1,2,3,5,8,10,15,18,19,25) главное условие, чтобы все цифры левой колонки присутствовали в правой |
Перед запросом в базу , поменяй запятые в POST на разделители |
знак | в regexp значит "или"
Тесть если сделать regexp '[[:<:]](1|3|10|125|168)[[:>:]] на поле с данными где 1,10,125,3,168 всё отработает как надо и не надо заморачиваться со сложной структурой