Sql для изменения условия where

#php #mysql #sql #codeigniter

#php #mysql #sql #codeigniter

Вопрос:

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

Комментарии:

1. какова структура вашей таблицы на данный момент?

Ответ №1:

Самое простое решение (не самое лучшее, ИМХО, но одно из самых простых) — использовать полнотекстовый индекс 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% вашего набора данных.

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

Ответ №2:

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

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