MYSQL метод поиска полей
Пожалуйста, помогите, я очень запутался в моей ситуации.
Я начинаю создавать функцию поиска, но я не уверен, что лучший способ сделать это. На переднем конце пользователи смогут вводить слова в текстовое поле, затем они будут искать в базе данных MYSQL, как показано ниже:
поэтому они ищут "Adult", и в списке указывается каждый item_id (первичный ключ) с "Adult" в столбце "name". Или они вводят "черный", и каждый элемент_id с "черным" в "цветах" указан в списке. или они вводят "Adult Blue", и каждый элемент с "Adult" или " Blue" будет отображаться. Я уверен, что вы поняли идею.
Я прочитал о нескольких методах, но я не могу понять, какой из них лучше:
Использование таблицы MANY TO ONE: кажется, что это будет работать, но есть более 500 уникальных элементов, то есть тысячи и тысячи строк. Для item_id 1 мне нужно было бы сделать строку для "Adult", строку для "Denim", строку для "Pants", строку для "black", строку для "red", строку для "blue". Я мог бы просто жестко закодировать все.
С помощью FIND_IN_SET
: Это будет работать? Должен ли я хранить значения с запятыми, как Adult,Denim,Pants
а также EXPLODE
разделить значения? Я собирался попробовать этот метод, но я продолжаю читать, что хранение нескольких значений в поле - очень плохая практика.
Или я ищу регулярные выражения?
Каков наилучший способ хранения значений и как их получить? Я не спрашиваю точный код, просто методы для использования. Любой совет приветствуется!
2 ответа
Итак, если мы предположим, что столбцы name
а также colors
это единственные столбцы, которые нам нужно искать, я бы сделал следующее (наивное решение, но оно будет работать нормально, если в вашей БД нет миллионов строк, а у вас нет тысяч клиентов, ищущих одновременно).
Сначала создайте вид
CREATE VIEW SearchHere AS
SELECT item_id, CONCAT(name, ' ', colors) AS FullDescription
FROM table
Я не знаю названия таблицы на вашем скриншоте, поэтому я использовал table
как его имя.
Теперь, если пользователь ищет adult red pants
Вы можете оформить запрос
SELECT item_id
FROM SearchHere
WHERE FullDescription LIKE '%adult%'
AND FullDescription LIKE '%red%'
AND FullDescription LIKE '%pants%'
Конечно, вам нужно сгенерировать запрос на лету, но это не проблема. Вы можете играть с использованием AND
или же OR
и помещая пробелы между символом подстановки %
и поисковый термин. Возможно, вы также захотите сделать вид более изощренным, например, сделать больше, чем просто CONCAT
,
Простое решение заключается в использовании
name REGEXP 'the|search|terms'
OR colors REGEXP 'the|search|terms'
Вы должны объяснить, что вы подразумеваете под лучшим, однако - самая быстрая производительность? проще всего поддерживать? Другой?