mysql 相似,mysql – SQL-选择最相似的产品

好吧,我有一个存储两个键的关系,产品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

上面的查询获得了所有产品最接近的匹配项,您可以在最里面的查询中包含product_id,以获取特定product_id的结果,我使用了LEFT JOIN,这样即使产品没有匹配项,也会显示

希望这可以帮助

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值