当前位置: 首页 > 面试题库 >

SQL-选择最相似的产品

唐运诚
2023-03-14
问题内容

好的,我有一个关系,该关系存储两个键,一个产品ID和一个属性ID。我想弄清楚哪种产品与给定的产品最相似。(属性实际上是数字,但这会使示例更加混乱,因此已将其更改为字母以简化视觉表示。)

Prod_att

Product | Attributes  
   1   |    A     
   1   |    B  
   1   |    C  
   2   |    A  
   2   |    B  
   2   |    D  
   3   |    A  
   3   |    E  
   4   |    A

最初,这似乎很简单,只需选择产品具有的属性,然后计算每个产品共享的属性数。然后将其结果与一个产品具有的属性数量进行比较,我可以看到两个产品的相似程度。这适用于相对于其比较产品具有大量属性的产品,但是当产品具有很少的属性时会出现问题。例如,产品3几乎与其他所有产品都有联系(因为A很常见)。

SELECT Product, count(Attributes)  
FROM Prod_att  
WHERE Attributes IN  
(SELECT Attributes  
FROM prod_att  
WHERE Product = 1)  
GROUP BY Product
;

关于如何解决此问题或对当前查询进行改进的任何建议?
谢谢!

*编辑:产品4将为所有产品返回count()= 1。我想展示产品3更相似,因为它具有更少的不同属性。


问题答案:

试试这个

SELECT 
  a_product_id, 
  COALESCE( b_product_id, 'no_matchs_found' ) AS closest_product_match
FROM (
  SELECT 
    *,  
    @row_num := IF(@prev_value=A_product_id,@row_num+1,1) AS row_num,
    @prev_value := a_product_id
  FROM 
    (SELECT @prev_value := 0) r
    JOIN (
        SELECT 
         a.product_id as a_product_id,
         b.product_id as b_product_id,
         count( distinct b.Attributes ),
         count( distinct b2.Attributes ) as total_products
        FROM
          products a
          LEFT JOIN products b ON ( a.Attributes = b.Attributes AND a.product_id <> b.product_id )
          LEFT JOIN products b2 ON ( b2.product_id = b.product_id )
       /*WHERE */
         /*  a.product_id = 3 */
        GROUP BY
         a.product_id,
         b.product_id
        ORDER BY 
          1, 3 desc, 4
  ) t
) t2 
WHERE 
  row_num = 1

上面query获取了closest matches所有产品的,您可以product_id在最里面的查询中包含,以获取特定的结果product_id,我已经使用过了LEFT JOIN,即使aproduct没有匹配项,它的显示

SQLFIDDLE

希望这可以帮助



 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : 获取SQL中另一列的每个值的最通用值 (9个答案) 6年前关闭。 我对SQL刚起步(我正在使用MySQL),需要一些帮助。我目前正在尝试从称为PERSON的表中选择最常见的年龄。假设PERSON的AGE列的值为:10、10、20、20、30。查询应返回值10和20。 以下查询仅检索第一行(20): 我的另一个想法是尝试类似的方法: 这将返回一个错误,指出

  • 问题内容: 我在表中有三列:id,街道名称,计数。对于某些ID,不只是一个街道名称。Count告诉将每条街道分配给ID的频率。我怎样才能只获得编号最高的ID和街道名称。 表格示例: 结果应该是这样的: 提前致谢! 问题答案: 您没有指定正在使用的数据库,但是应该可以使用以下数据库: 请参阅带有演示的SQL Fiddle 。注意,您将必须使用MySQL的反引号或数据库使用的任何字符来转义保留字来转义

  • 问题内容: 我有一个看起来像这样的报告: 这是通过SQL完成的(特别是T-SQL版本的Server 2005): 我希望该报告仅显示每个工作流程的最早日期: 有任何想法吗?我不知道这一点。我尝试使用嵌套的选择返回最早的托盘日期,然后在WHERE子句中进行设置。如果只有一家公司,这将非常有用: 但是,如果该表中有不止一家公司,那么这显然将行不通。任何帮助表示赞赏! 问题答案: 只需使用

  • 问题内容: 我有下表: 我想从一个特定的组中选择前20个不同的名称,该组按该组中最常见的名称排序。对于第1组,此示例的结果将返回(a-3次出现,b-2次出现和c-1次出现)。 谢谢你。 问题答案:

  • 问题内容: 在TableA中,我有一个int列。 是否可以仅使用一条select语句来选择不存在且大于0的列中的最小值? 例如,如果col具有值1,2,9,则select语句将返回3。如果col具有9,10,11,它将返回1。 我可以使用临时表或循环来实现,但是我想知道是否可以仅使用select语句来实现? 问题答案: 拥有一个从1到最大值(或更高)的数字表

  • 问题内容: 我有三个SQL选择,需要将它们的结果加在一起。这三个中的两个使用相当复杂的联接。 我需要的是所有三个值的总和。 。无论如何,是否可以在单个语句中执行此操作? 问题答案: 你可以的。 请勿使用,因为它会忽略重复的值(会导致)。