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'

Вы должны объяснить, что вы подразумеваете под лучшим, однако - самая быстрая производительность? проще всего поддерживать? Другой?

Другие вопросы по тегам