Выборка из базы близких значений

Тема в разделе "Базы данных", создана пользователем UDAV, 11 сен 2014.

Модераторы: latteo
  1. UDAV

    UDAV

    Регистр.:
    22 июн 2007
    Сообщения:
    781
    Симпатии:
    153
    Помогите сделать запрос. Есть база mysql с такой структурой:
    id - цифра - группа
    1 - 3 - 1
    2 - 7 - 1
    3 - 10 -2
    4 - 49 -2
    ...и тд, т.е. поле "цифра" содержит только цифры, они не уникальные и идут не одна за другой...

    нужно выбрать ОДНУ запись из каждой группы которая соответствует ближайшему значению переменной. Например имеем число 6, нужно выбрать из группы 1 ближайшую запись из поля "цифра", это будет запись с id 2, а из группы 2 выбрать запись с id 3...
    групп может быть около 10.
     
  2. Demian12

    Demian12 Создатель

    Регистр.:
    13 авг 2014
    Сообщения:
    12
    Симпатии:
    9
    Пускай столбцы и таблица описаны так:
    Код:
    create table T1 (ID TINYINT, CIFRA TINYINT, GRUPPA TINYINT);
    insert into t1 values (1,3,1);
    insert into t1 values (2,3,1);
    insert into t1 values (3,7,1);
    insert into t1 values (4,10,2);
    insert into t1 values (5,49,2);
    
    Нам нужно найти записи для переменной, чье значение равно 6. Запрос такой:
    Код:
    select MIN(ID), MIN(CIFRA), GRUPPA from T1
    where (select count(*) from T1 as T2 where T2.GRUPPA = T1.GRUPPA and ABS(T2.CIFRA-6) < ABS(T1.CIFRA-6)) = 0
    group by GRUPPA
    
    Если не 6, а 18, к примеру, то меняем последнее условие в подзапросе на:
    Код:
    ABS(T2.CIFRA-18) < ABS(T1.CIFRA-18)
    Вот ссылка на SQL Fiddle поиграться: http://sqlfiddle.com/#!2/e0178c
     
    Belora23 и UDAV нравится это.
  3. Belora23

    Belora23 Постоялец

    Регистр.:
    27 янв 2009
    Сообщения:
    65
    Симпатии:
    4
    Добавлю, что если предполагается множество групп или иерархия в группах, то лучше их (группы) вынести в отдельную таблицу. Потом всё джойним в кучу и получаем аналогичные запросы.