Как выбрать значения, которые находятся вне диапазона?

Привет, у меня есть таблица со структурой ниже:

create table prices(
    id int not null,
    mini float not null,
    maxi float not null,

    primary key (id)
);

И я выбираю идентификаторы строк, которые находятся в пределах определенного диапазона. Следующая скрипка говорит сама за себя: http://sqlfiddle.com/

set @pmini1 = 82.5;
set @pmaxi1 = 85.5;

select *
from prices
where ((@pmini1 between mini and maxi) or 
(@pmaxi1 between mini and maxi));

Итак, знайте, что я пытаюсь реализовать в следующих условиях:

  • если диапазон выше, чем самый высокий макси таблицы, тогда он выберет идентификатор элемента с самым высоким макси.
  • если диапазон ниже, чем самый низкий мини таблицы, то он выберет идентификатор элемента с самым низким мини.

Можно ли сделать это, не используя более одного запроса? Любой совет или совет будут оценены.

Если вам нужна дополнительная информация, дайте мне знать, и я отредактирую пост.

1 ответ

Решение

Одним из способов является вычисление минимума мини и максимума макси, а затем использовать их для сравнения:

select *
from prices p cross join
     (select MIN(mini) as minmini, MAX(maxi) as maxmaxi from p) const
where ((@pmini1 between p.mini and p.maxi) or 
       (@pmaxi1 between p.mini and p.maxi) or
       (@pmini1 < const.minmini and p.mini = const.minmini) or
       (@pmaxi1 > const.maxmaxi and p.maxi = const.maxmaxi)
      )

В MySQL вы также можете выразить это более кратко:

select *
from prices p cross join
     (select MIN(mini) as minmini, MAX(maxi) as maxmaxi from p) const
where ((greatest(@pmini1, const.minmini) between p.mini and p.maxi) or 
       (least(@pmaxi1, const.maxmaxi) between p.mini and p.maxi)
      )
Другие вопросы по тегам