SQL Сортируйте результаты по соответствию релевантности и отображайте цену в зависимости от рейтинга продавца - PullRequest
0 голосов
/ 01 апреля 2020

Хотите отобразить результаты, основанные на «релевантности» поиска пользователей вместе с наиболее продаваемой ценой продавца. Живой пример того, к чему я стремлюсь, - это результаты поиска Amazons, теперь я понимаю, что их алгоритм чрезвычайно сложен, но мне нужна упрощенная версия.

Допустим, мы ищем 'Jumper', результаты которого возвращаются товары, связанные с «перемычкой», но тогда цена не всегда самая дешевая на основе рейтинга продавца. Продавец с наивысшим рейтингом отображает свои цены.

Вот то, над чем я работал, но не дал мне ожидаемых результатов в упомянутом выше, и, честно говоря, я не думаю, что это очень эффективно .

SELECT a.catalogue_id, a.productTitle, a.prod_rank, b.catalogue_id, b.display_price, b.sellers_rank
FROM 

(
    SELECT c.catalogue_id,
           c.productTitle,
           MATCH(c.productTitle) AGAINST ('+jumper*' IN BOOLEAN MODE) AS prod_rank 
    FROM catalogue AS c
    WHERE c.catalogue_id IN (1, 2, 3)
) a

JOIN 

(
    SELECT inventory.catalogue_id, 
           inventory.amount AS display_price,
           (accounts.comsn + inventory.quantity - inventory.amount) AS sellers_rank

    FROM inventory 
    JOIN accounts ON inventory.account_id = accounts.account_id 
    WHERE inventory.catalogue_id IN (1, 2, 3)
) AS b

ON a.catalogue_id = b.catalogue_id 

ORDER BY a.prod_rank DESC
LIMIT 100;

Образцы таблиц:

Accounts:
----------------------------
account_id | comsn
----------------------------
1          | 100
2          | 9999




Catalogue:
----------------------------
catalogue_id | productTitle
----------------------------
1            | blue jumper
2            | red jumper
3            | green jumper




Inventory:
-----------------------------------------------
product_id | catalogue_id | account_id | quantity | amount |
-----------------------------------------------
1           | 2           | 1          | 6        | 699
2           | 2           | 2          | 2        | 2999

Ожидаемые результаты:

Product Title:
red jumper

Amount:
29.99 (because he/she has sellers rank of: 7002)

1 Ответ

0 голосов
/ 01 апреля 2020

Во-первых, вы должны ограничить результаты только совпадениями для первого подзапроса:

Во-вторых, вы должны исключить второй подзапрос:

SELECT p.catalogue_id, p.productTitle, p.prod_rank,
       i.amount as display_price,
       (a.comsn + i.quantity - i.amount) 
FROM (SELECT c.catalogue_id, c.productTitle,
             MATCH(c.productTitle) AGAINST ('+jumper*' IN BOOLEAN MODE) AS prod_rank 
      FROM catalogue AS c
      WHERE c.catalogue_id IN (1, 2, 3)
      HAVING prod_rank > 0
     ) p JOIN 
     inventory i
     ON i.catalogue_id = c.catalogue_id join
     accounts a
     ON i.account_id = a.account_id 
ORDER BY c.prod_rank DESC
LIMIT 100;

Я не уверен, что вы можно избавиться от финала ORDER BY. MATCH с JOIN может быть немного хитрым в этом отношении. Но только упорядочение по матчам должно помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...