2017-04-21 2 views
2

데이터베이스에서 3 개의 주어진 숫자 중 가장 가까운 값을 찾고 "테스트"셀을 반환해야합니다.데이터 계산을 사용하는 SQL 선택 쿼리

이들은 내가 원하는 테이블의 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 = 내가 그것을 "sample2를"를 반환 할 140 는

+0

게시자는 스키마, 샘플 데이터 및 예상 출력을 이상적으로 SQLFiddle로 게시하십시오. –

+0

하나의 id 열과 primary_key라는 또 다른 열이 있습니다. 어떤 것이 기본 키입니까? – jarlh

+0

필자는 내 질문을 편집했습니다. 기본 키는 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 동의합니다. 메모에 따라 업데이트했습니다. –