我需要找到数据库中三个给定数字的最近点并返回它们的“测试”单元格。
这些是我想要做的计算,其中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”
答案 0 :(得分:3)
这个想法是你可以按距离排序行,然后只返回第一行(较低距离)。
另外考虑一下,如果省略了部首和分数,结果不会改变。与使用POWER功能相比,这将加速搜索以及编写显式产品。
SELECT test
FROM `my table`
ORDER BY ($rr-r)*($rr-r) + ($gg-g)*($gg-g) + ($bb-b)*($bb-b)
LIMIT 1;