好的,我有一个关系,该关系存储两个键,一个产品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选择,需要将它们的结果加在一起。这三个中的两个使用相当复杂的联接。 我需要的是所有三个值的总和。 。无论如何,是否可以在单个语句中执行此操作? 问题答案: 你可以的。 请勿使用,因为它会忽略重复的值(会导致)。