2017-04-21 11 views
2

私のデータベースに3つの与えられた数字の最も近い点を見つけ、 "テスト"セルを返す必要があります。データ計算によるSQL選択クエリ

これは私がやりたい計算です。r1、g1とb1はテーブルの異なる列で、r2、g2とb2は与えられた数です。 IVEは、これまでに得たもの

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までの乱数で、最適な検索にはどのようなアルゴリズムを使用できますか?

サンプルテーブル番号RR = 151 GG = 18、BB = 140 私は、それは "サンプル2" を返すようにしたい特定の

╔════╦══════════════╦══════╦════╦═════╦ 
║ 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 ║ 
╚════╩══════════════╩══════╩════╩═════╝ 

+0

ポストスキーマ、サンプルデータ、および予想される出力 - 理想的にはSQLFiddleとして投稿してください –

+0

あなたは1つのid列と、primary_keyという別の列を持っています。どちらがプライマリキーですか? – jarlh

+0

ive私の質問を編集した、プライマリキーはIDです – evnartabt

答えて

3

アイデアはあなたが距離によって行を注文することができるということです最初のものだけを取り戻す(低い距離)。

また、ラジカルと分数を省略すると、結果は変更されません。これにより、POWER機能を使用するのではなく、検索のスピードアップと明示的な製品の作成が可能になります。

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

私はMySQLについてはよく分かりませんが、POWER機能を使用する代わりに、($ rr-r)*($ rr-r)を書く方が速いかもしれません。 – maraca

+0

@maraca私は同意する、私はあなたのノートに応じて更新しました。 –