복붙노트

[SQL] MySQL의 쿼리와 가장 가까운 수치를 선택

SQL

MySQL의 쿼리와 가장 가까운 수치를 선택

이것은 쉽게 내가 만드는 중이라서보다 아마이지만, 기본적으로 내가 뭘해야 지정된 값으로 열에서 가장 가까운 숫자가있는 행을 선택합니다. 예를 들면 :

10, 15, 16 : 지정된 컬럼 3 행에 대한 값을 데이터베이스에 목록

내가 14에 가장 가까운 행을 지정할 경우, 15 행을 선택합니다.

같은 거리에있는 2 개 + 행이 경우에도, 그 중 하나를 임의로 선택합니다.

해결법

  1. ==============================

    1.하나의 옵션은는 다음과 같다 :

    하나의 옵션은는 다음과 같다 :

    select   the_value,
             abs(the_value - 14) as distance_from_test
    from     the_table
    order by distance_from_test
    limit 1
    

    임의의 레코드를 선택하려면 ORDER BY 절에, 랜드 ()를 추가 할 수 있습니다. 이 방법의 단점은 파생 된 값 distance_from_test을 정렬해야하기 때문에 당신이 인덱스에서 어떤 혜택을 얻을 수 없다는 것입니다.

    당신이 the_value에 인덱스가 있고 관계의 경우 무작위로 결과에 대한 귀하의 요구 사항을 완화하는 경우, 당신은 바로 아래 바로 테스트 값 위의 첫 번째 값과 제 값을 선택 제한된 범위 쿼리의 한 쌍을 수행 할 수 있습니다 테스트 값에 가장 가까운 중 테스트 값과 선택 :

    (
    select   the_value
    from     the_table
    where    the_value >= 14
    order by the_value asc
    limit 1
    )
    union
    (
    select   the_value
    from     the_table
    where    the_value < 14
    order by the_value desc
    limit 1
    )
    order by abs(the_value - 14)
    limit 1
    
  2. ==============================

    2.인덱스를 사용하기 위해서는, 당신은 목표 위의 최소값, 아래의 최대 값을 선택할 수 있습니다. 그런 다음 당신은 단지 확인하기 위해 두 개의 값을 가지고있다.

    인덱스를 사용하기 위해서는, 당신은 목표 위의 최소값, 아래의 최대 값을 선택할 수 있습니다. 그런 다음 당신은 단지 확인하기 위해 두 개의 값을 가지고있다.

  3. ==============================

    3.당신은 어떻게 넥타이 차단기를 처리 할 것인가? 이 첫 번째 걸릴 것 때문에 :

    당신은 어떻게 넥타이 차단기를 처리 할 것인가? 이 첫 번째 걸릴 것 때문에 :

      SELECT t.col
        FROM TABLE t
    ORDER BY ABS(t.col - @val)
       LIMIT 1
    

    인덱스 안전한 대안 :

      SELECT xt.col
        FROM (SELECT t.col,
                     ABS(t.col - @val) 'diff'
                FROM TABLE t) xt
    ORDER BY xt.diff
       LIMIT 1
    
  4. from https://stackoverflow.com/questions/1634725/select-closest-numerical-value-with-mysql-query by cc-by-sa and MIT license