我需要在数据库中找到三个给定数字的最接近点并返回它们的“测试”单元格。
这些是我想要做的计算,其中 r1、g1 和 b1 是表中的不同列,r2、g2 和 b2 是给定的数字。
d=sqrt((r2-r1)^2+(g2-g1)^2+(b2-b1)^2)
p=min(d/sqrt((255)^2+(255)^2+(255)^2))
到目前为止我得到的是
$rr = 130;
$gg = 83;
$bb = 234;
SELECT test
FROM `my table`
WHERE MIN(SQRT(POWER($rr-r,2)+POWER($gg-g,2)+POWER($bb-b,2)) /
(SQRT(POWER(255,2)+POWER(255,2)+POWER(255,2)))
我正在寻找解决这个问题的方法,也许我可以使用 php 在 mysql 之外进行计算?
我的表中的数据是 0 到 255 之间的随机数,我可以使用什么算法进行最佳搜索?
示例表
╔════╦══════════════╦══════╦════╦═════╦
║ id ║ test ║ r ║ g ║ b ║
╠════╬══════════════╬══════╬════╬═════╣
║ 1 ║ sample1 ║ 4 ║ 72 ║ 251 ║
║ 2 ║ sample2 ║ 148 ║ 9 ║ 139 ║
║ 3 ║ sample3 ║ 101 ║ 233║ 88 ║
║ 4 ║ sample4 ║ 231 ║ 147║ 16 ║
╚════╩══════════════╩══════╩════╩═════╝
给定数字 rr=151 gg= 18 和 bb=140 我希望它返回“sample2”
最佳答案
这个想法是,您可以按距离对行进行排序,然后仅返回第一个(距离较小)。
还要考虑到,对于顺序,如果省略根号和分数,结果不会改变。这将加快搜索速度并编写显式产品,而不是使用 POWER 函数。
SELECT test
FROM `my table`
ORDER BY ($rr-r)*($rr-r) + ($gg-g)*($gg-g) + ($bb-b)*($bb-b)
LIMIT 1;
关于php - SQL select查询与数据计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43537247/