Sql для меняющихся где условия - PullRequest
0 голосов
/ 07 мая 2011

Я разрабатываю сайт рецептов с использованием codeigniter (я использую mysql в качестве базы данных). Пользователь может войти любое количество ингредиентов. Мне нужно искать рецепты, которые содержат эти ингредиенты. Т.е. если пользователь кладет яйца и помидоры, мне нужно искать рецепты, использующие оба рецепта. Результат поиска должен быть упорядочен по меньшему количеству необходимых дополнительных ингредиентов. Так как количество ингредиентов варьируется, как написать запрос SQL? Как заказать результат поиска? Есть идеи, как это сделать? Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 07 мая 2011

Самое простое решение (не самое лучшее, IMHO, но одно из самых простых) - это использование полнотекстового индекса MySQL.Вы можете начать с чтения документации MySQL по полнотекстовому индексу , это чрезвычайно полезно для создания небольшой поисковой системы.Заимствование объяснений из википедии :

При полнотекстовом поиске поисковая система проверяет все слова в каждом сохраненном документе, поскольку она пытается сопоставить поисковые слова, предоставленные пользователем.

Итак, в моем предложении вы можете иметь эту таблицу, подобную этой:

----------------------------------------
RECIPES
----------------------------------------
id          | int(11)      | PRIMARY KEY
title       | varchar(255) |
body        | mediumtext   |
ingredients | tinytext     | FULLTEXT

Замечания:

  • Добавить полнотекстовый индексдо ingredients только поле.

  • Храните ингредиенты внутри поля ingredients, разделенные пробелом, не используйте запятую.

  • Храните ингредиенты в двух местах, поле ingredients выше просто для поиска.Возможно, вам лучше использовать другую таблицу для хранения списка ингредиентов для других вариантов использования.

  • Поскольку вы используете полнотекстовый индекс, вы можете использовать синтаксис BOOLEAN MODE.Если вы хотите искать рецепты, которые имеют egg и tomato, используйте +eggs +tomato, если вы хотите искать рецепты, которые содержат egg, но не tomato, используйте +egg -tomato.См. Руководство MySQL для подробного объяснения .

Опять же, это может быть не лучшим решением, но это первое, о чем я могу подумать, и, конечно, это легко.

Несколько предостережений:

  • Полнотекстовый движок MySQL не распознает слова с длиной менее 4 символов по умолчанию, вы можете изменить это.

  • Если вы не используете логический режим, полнотекстовый поиск MySQL вернется пустым, если будет получен результат, если более 50% вашего набора данных.

  • Полнотекстовый поиск будет игнорироватьсястоп-слова, вот список .

0 голосов
/ 07 мая 2011

http://www.jarrodgoddard.com/web-development/advanced-web-site-search-with-sql вот статья о том, как использовать MySQL Queries для получения релевантных результатов поиска.С небольшим творческим потенциалом вы можете добавить релевантность, упорядочив их по количеству определенного ингредиента.

Как сохраняются ингредиенты?Надеюсь в реляционной таблице (recipe_id, ингридиент_id, количество)?Это облегчает поиск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...