SQL选择查询与数据计算

时间:2017-04-21 08:07:49

标签: php mysql sql algorithm

我需要找到数据库中三个给定数字的最近点并返回它们的“测试”单元格。

这些是我想要做的计算,其中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”

1 个答案:

答案 0 :(得分:3)

这个想法是你可以按距离排序行,然后只返回第一行(较低距离)。

另外考虑一下,如果省略了部首和分数,结果不会改变。与使用POWER功能相比,这将加速搜索以及编写显式产品。

SELECT test
  FROM `my table` 
  ORDER BY ($rr-r)*($rr-r) + ($gg-g)*($gg-g) + ($bb-b)*($bb-b)
  LIMIT 1;