【问题标题】:How to filter search results in this example在此示例中如何过滤搜索结果
【发布时间】:2010-11-15 01:08:16
【问题描述】:

我有一个包含数千种产品的产品表。有些产品有不同的颜色可供选择。但是当有人搜索“mp3 player”时,我不想向他展示每种颜色,而只是展示最畅销颜色的播放器。

她是表格布局(简化):

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 用于创建结果。

【问题讨论】:

    标签: sql postgresql full-text-search filtering ranking


    【解决方案1】:

    如果我理解您的问题,只需按 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
    

    【讨论】:

      【解决方案2】:

      会是这样的

      SELECT TOP 1 (*) FROM table
      WHERE PRODUCT_NAME LIKE 'mp3 player %' 
      ORDER BY SALE_COUNT DESC
      

      因此,我们只选择顶行,按 SALE_COUNT 降序排序(因此最高的销售计数位于顶部)

      【讨论】:

        【解决方案3】:
        SELECT  *
        FROM    products
        WHERE   product_name LIKE 'mp3 player%'
        ORDER BY
                sale_count DESC
        LIMIT 1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-14
          • 2012-05-18
          • 2012-12-29
          相关资源
          最近更新 更多