【问题标题】:MySQL: Grouping results by perceptual hash similarityMySQL:通过感知哈希相似度对结果进行分组
【发布时间】:2018-06-15 00:50:44
【问题描述】:

假设我们有 MySQL 表 Image 和以下列

  • 身份证
  • user_id
  • p_hash

我知道如何计算新插入行的感知散列与表中所有现有数据之间的汉明距离(以显示相似图像)。 SQL 查询如下所示:

SELECT `Image`.*, BIT_COUNT(`p_hash` ^ :hash) as `hamming_distance`
FROM `Image`
HAVING `hamming_distance` < 5

我想对每个现有的图像做同样的事情。(检查数据库中是否有类似的图像) 所以,我遍历了Image 表的每一行,执行与上述相同的过程,并从表中找到相似的图像。

现在的问题是,在整个过程之后,只有当每个组的元素至少有一个不同的user_id id 时,我才想获得相似的图像组?

因此,如果发现一组相似图像属于一个用户,则跳过它。但如果它属于多个不同的用户,则将其作为结果之一返回。

请帮忙解答一下。

【问题讨论】:

  • 示例数据和预期结果在这里会有所帮助。

标签: mysql sql phash


【解决方案1】:

听起来你想要一个自我加入。

SELECT i1.id, GROUP_CONCAT(i2.id) AS similar_images
FROM Image AS i1
JOIN Image AS i2 ON i1.user_id != i2.user_id AND BIT_COUNT(i1.`p_hash` ^ i2.p_hash) < 5
GROUP BY i1.id

DEMO

【讨论】:

  • 我不认为这就是 OP 所追求的,但样本数据集可能会澄清问题
  • 如果相似图像属于同一用户,如何跳过它?只有当一张图片属于一个用户,另一张属于不同的用户时,我才需要相似。
  • 我将查询更改为下面的查询,但它没有返回任何结果SELECT i1.id, GROUP_CONCAT(i2.id) AS similar_images FROM Image AS i1 JOIN Image AS i2 ON i1.id != i2.id AND i1.user_id != i2.user_id AND BIT_COUNT(i1.p_hash` ^ i2.p_hash)
  • 如果用户 ID 不同,则不需要 i1.id != i2.id。但是,如果我了解您在寻找什么,我认为这应该可行。您确定您有来自不同用户的哈希值相似的图像吗?我认为数据类型并不重要。
  • 我可以将此查询也应用于 bin(64) 类型的 p_hash 列吗?示例值为:1000000000000000000010100000000000101010000000000010101010000000
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多