mysql - MySQL:通过感知哈希相似度对结果进行分组
问题描述
假设我们有Image
带有以下列的 MySQL 表
- ID
- 用户身份
- p_hash
我知道如何计算新插入行的感知散列与表中所有现有数据之间的汉明距离(以显示相似的图像)。SQL 查询如下所示:
SELECT `Image`.*, BIT_COUNT(`p_hash` ^ :hash) as `hamming_distance`
FROM `Image`
HAVING `hamming_distance` < 5
我想对每个现有的图像做同样的事情。(检查数据库中是否有类似的图像)所以,我已经遍历了Image
表的每一行,执行与上面相同的过程并从表中找到相似的图像。
现在的问题是,在整个过程之后,只有当每个组的元素至少有一个不同的user_id
id 时,我才想获得相似的图像组?
因此,如果发现一组相似图像属于一个用户,则跳过它。但如果它属于多个不同的用户,则将其作为结果之一返回。
请帮忙弄清楚。
解决方案
听起来你想要一个自我加入。
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
推荐阅读
- java - Java - Math.asin() 仅返回 0
- react-native - 反应原生打包程序构建捆绑循环
- ios - 轮播视图在从 iOS 的主详细信息菜单第二次进入后重叠一页,仅在 XAMARIN 的 Android 中运行良好
- android - weightsum 文本和图像在 xml android 中无法正确显示
- bar-chart - pygal + 条形图 + 根据 x_label 更改同一系列中值的颜色
- python - 在 Python 中安装 symfit 库时出错
- android - Xamarin Android - CrossGeeks - AzurePushNotificationPlugin - 如果应用程序位于前台则隐藏通知(android 和 ios)
- javascript - 在 "<%: %>" 中包含一个 JS 变量
- javascript - 确定渲染树中的元素
- python - 仅使用正则表达式查找最长子字符串的快速方法