Вопрос

У меня есть таблица продуктов, которая содержит тысячи продуктов.Некоторые продукты доступны в разных цветах.Но когда кто-то ищет, например, "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 (так, чтобы наибольшее количество продаж было вверху).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top