Как выбрать строку у которой в одном поле текст совпадает с тем что ищем?

FRIE

Новичок
Народ, буду очень рад если кто поможет разобраться =)

Задача такая, есть товар и у него есть составляюще. Допустим есть телефон, у него свойства -gprs,mms,sms,wap,bluetooth. ну и еще какие-то, не буду писать много. И телефонов много. А я хочу сделать подобие яндекс маркета, где можно искать товар с нужными опциями. Делать для каждой функции отдельную колонку и писать в ней true/false или 1/0 считаю что бред, так как таких колонок может быть очень много.

Я решил что лучше сделать одну ячейку для каждого телефона, в которой перечислить составляющие через запятую. А потом искать совпадения в этих ячейках.

Проблема в том что не понятно что писать в выражении WHERE. То-есть пользователь может выбрать чтобы телефон был с gprs mms и sms, тогда нужно сразу 3 совпадения в одной ячейке найти. И еще нужно обратную функцию, например если пользователь хочет чтобы в телефоне не было wap и gprs.
И такой случай когда он хочет чтобы был wap и sms, а bluetooth чтобы не было.


Читал
тут
тут
тут и
тут


Больше всего мне кажется подходит SELECT IN, но в интернете не получилось найти примеры.

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

Dovg

Продвинутый новичок
считаю что бред
А предложенная структура не бред?

Я бы сделал таблицу с телефонами (id, name), таблицу с именами свойств (id, name), таблицу со значениями свойств для телефонов (id, phone_id, property_id, value). В этом случае будет искаться одним select с двумя джойнами.
 

FRIE

Новичок
А предложенная структура не бред?

Я бы сделал таблицу с телефонами (id, name), таблицу с именами свойств (id, name), таблицу со значениями свойств для телефонов (id, phone_id, property_id, value). В этом случае будет искаться одним select с двумя джойнами.
Атомарность дело хорошее, но когда свойств минимум 50, и в последствии дополнительные свойства не известны, а данные заполняют пользователи, то тогда такая структура не катит. Забыл это упомянуть
 

KorP

Новичок
когда свойств минимум 50, и в последствии дополнительные свойства не известны, данные заполняют пользователи, то тогда такая структура не катит
эм, я видимо что то в этой жизни не понимаю - но какая разница? или у тебя пользователи свойства телефонов в тестовое поле через запятую фигачат? :)
 
  • Like
Реакции: Dovg

FRIE

Новичок
эм, я видимо что то в этой жизни не понимаю - но какая разница? или у тебя пользователи свойства телефонов в тестовое поле через запятую фигачат? :)
Они выбирают через админку. И это вовсе не телефоны. Я как пример привёл чтобы вы поняли.
 

KorP

Новичок
Они выбирают через админку. И это вовсе не телефоны. Я как пример привёл чтобы вы поняли.
можешь в моём ответе слово - телефоны заменить на то что тебе там подходит - сути это не меняет
ну раз через админку, значит какими-нить селектами и чекбоксами, тогда что ты переживаешь что "данные заполняют пользователи" - какая разница в этом случае? тут уже вопрос тогда к тебе в правильности обработки данных. в конечном результате для БД должно быть совершенно по барабану. Dovg тебе привёл вполне работоспособный, адекватный вариант. По крайней мере лучше чем в строку писать.
 

FRIE

Новичок
значит по принципу атомарности? по другому не делаются такие вещщи?
 

FRIE

Новичок
сделать можно любым способом, который будет работоспособен, другой вопрос - как сделать лучше/правильнее/удобнее
Значит так будет лучше да? =) а как построить запрос в котором выбрать телефон с состовляющими которые должны присутствовать и составляющими которые не должны присутствовать?
 

KorP

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

FRIE

Новичок
ну тебе же Dovg описал схему работы, нарисуй табличку, добавь данных немного, и там придёт решение как всё это дело выбрать, ну а если не придёт, уже с попытками реализации за советом можно будет сюда вернуться
я знаю как сджоинить 3 таблицы. Я знаю как выбрать данные. Мне не понятно как в одном запросе выбрать чтобытелефон поддерживал функцию смс и не поддерживал функцию mms
 

KorP

Новичок
как в одном запросе выбрать чтобытелефон поддерживал функцию смс и не поддерживал функцию mms
таблицу со значениями свойств для телефонов (id, phone_id, property_id, value)
я даже теряюсь как на твой вопрос ответить ещё более доступно :)
ты в эту таблицу заносишь те функции, которые телефон поддерживает, соответственно записи mms у тебя к телефону тогда не будет в таблице
 

FRIE

Новичок
Отлично что вы поняли мою мысль! Мне нужно сделать исключающий поиск, чтобы человек мог выбрать то, чего в телефоне быть не должно
 

KorP

Новичок
а, ну так подожди, я видимо не до конца уловил мысль Dovg, я по своей структуре ориентировался, есть же поле value - пиши туда true/false для всех функций и выбирай по этому полю, если тебе нужно только то, чего в телефоне нет
 

FRIE

Новичок
Отлично что вы поняли мою мысль! Мне нужно сделать исключающий поиск, чтобы человек мог выбрать то, чего в телефоне быть не должно
а, ну так подожди, я видимо не до конца уловил мысль Dovg, я по своей структуре ориентировался, есть же поле value - пиши туда true/false для всех функций и выбирай по этому полю, если тебе нужно только то, чего в телефоне нет
а если телефон поддерживает только функцию смс, то зачем еще более 50 полей писать false? =)
 

FRIE

Новичок
Отлично что вы поняли мою мысль! Мне нужно сделать исключающий поиск, чтобы человек мог выбрать то, чего в телефоне быть не должно
а, ну так подожди, я видимо не до конца уловил мысль Dovg, я по своей структуре ориентировался, есть же поле value - пиши туда true/false для всех функций и выбирай по этому полю, если тебе нужно только то, чего в телефоне нет
а если телефон поддерживает только функцию смс, то зачем еще более 50 полей писать false? =)
 

KorP

Новичок
а если телефон поддерживает только функцию смс, то зачем еще более 50 полей писать false? =)
балин, да ты задачу толком опиши - что тебе нужно?
если тебе нужно только то, чего нет - заноси в базу то чего нет :)
а если у тебя телефон поддерживает ВСЁ - ты 50 пунктов будешь в строку фигачить? а как ты по этой строке будешь искать то, чего нет? или у тебя будет 2 строки - одна с перечнем того что есть, а вторая с перечнем того - чего нет? :)
 

HEm

Сетевой бобер
Одно другому не мешает, кстати. Для вывода свойств тебе все равно придется нормализовывать данные, как это показал Dovg. А специально для такого поиска можешь генерировать этот сборный текст при добавлении/изменении данных по товару.
 
Сверху