Как фильтровать результаты поиска в этом примере
-
20-09-2019 - |
Вопрос
У меня есть таблица продуктов, которая содержит тысячи продуктов.Некоторые продукты доступны в разных цветах.Но когда кто-то ищет, например, "mp3-плеер", я не хочу показывать ему все цвета, вместо этого просто плеер с самым продаваемым цветом.
Это макет таблицы (упрощенный):
ID | PRODUCT_NAME | COLOR | SALE_COUNT
===========================================
1 | Mp3 player red | red | 2
2 | Mp3 player gold | gold | 1
3 | Mp3 player black | black | 100
Но, когда пользователь ищет "Mp3 player red", я хочу показать ему красный проигрыватель вместо черного.Поиск выполняется с помощью оператора 'like' (да, я знаю lucene, в любом случае мне нужно это решить).
Есть какие-нибудь предложения, как решить эту проблему?у меня есть несколько идей, но ни одна из них не кажется хорошим решением.Спасибо,
Для создания результата используется PostgreSQL db и jave.
Решение
Просто сделайте заказ по убыванию SALE_COUNT и выберите только первый, если я понимаю вашу проблему:
SELECT TOP 1 ID, PRODUCT_NAME, COLOR, SALE_COUNT
FROM table
WHERE PRODUCT_NAME LIKE '%' + @searchParam + '%'
ORDER BY SALE_COUNT DESC
Обязательно сначала очистите параметр поиска, удалив все возможные атаки с использованием sql-инъекций.
Редактировать:
Если вы используете postgres, синтаксис заключается в том, чтобы поставить "LIMIT n" в конце, так что:
SELECT ID, PRODUCT_NAME, COLOR, SALE_COUNT
FROM table
WHERE PRODUCT_NAME LIKE '%' + @searchParam + '%'
ORDER BY SALE_COUNT DESC
LIMIT 1
Другие советы
SELECT *
FROM products
WHERE product_name LIKE 'mp3 player%'
ORDER BY
sale_count DESC
LIMIT 1
это будет что-то вроде
SELECT TOP 1 (*) FROM table
WHERE PRODUCT_NAME LIKE 'mp3 player %'
ORDER BY SALE_COUNT DESC
Итак, мы выбираем только верхнюю строку, упорядоченную по убыванию SALE_COUNT (так, чтобы наибольшее количество продаж было вверху).