[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вывод данных из mysql
mirsaytov
Здравствуйте!

У меня такой вопрос: есть таблица отелей с полем, в котором хранятся 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 используется другое поле, которое содержит данные через запятую, т.е. вот так:

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 и т.д.)

Хитрый план какой-то laugh.gif

Тогда пример, чего в таблице содержится, чего приходит из формы и чего надо вывести в результат.

Спустя 15 минут, 37 секунд (8.03.2012 - 19:35) mirsaytov написал(а):
1. Есть таблица отелей, в этой таблице есть поле для записи 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 последовательность чисел всегда по возрастанию и полное соотвествие можно будет получить условием
WHERE filters_ids = '(1,2,5)'


UP Или без скобочек, если их в поле не пишешь.

Спустя 14 часов, 33 минуты, 53 секунды (9.03.2012 - 10:27) mirsaytov написал(а):
спасибо за ответы, но
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 всё отработает как надо и не надо заморачиваться со сложной структурой
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.