MySQL:按感知哈希相似性对结果进行分组

时间:2018-06-15 00:50:45

标签: mysql sql phash

假设我们有MySQL表Image,其中包含以下列

  • ID
  • 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的情况下获得相似的图像组?

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

请帮忙弄清楚。

1 个答案:

答案 0 :(得分:0)

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

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