SQL-запрос, чтобы постепенно изменять, где условие, пока результат не содержит то, что требуется - PullRequest
0 голосов
/ 16 мая 2010

Мне нужен SQL-запрос, чтобы выбрать некоторые элементы из таблицы на основе некоторого условия, основанного на поле категории.В качестве примера рассмотрим список людей, и я получаю людей из определенной возрастной группы из базы данных.Я хочу проверить, содержит ли результат хотя бы один результат из каждой категории.Если нет, я хочу изменить возрастную группу, расширив ее и проверив результаты еще раз.Это повторяется до тех пор, пока я не получу возрастную группу, для которой имеется один результат для каждой категории.Сейчас я делаю это, анализируя результаты и модифицируя SQL-запрос.Таким образом, отправлено несколько запросов выбора SQL.Каков наиболее эффективный способ сделать это?Я вызываю запросы на выборку из java-программы, используя jdbc.Я использую базу данных mysql.

Ответы [ 2 ]

1 голос
/ 17 мая 2010

Вы можете сделать это в одном запросе, не применяя фильтрацию к категории, диапазон которой вам неизвестен. Ключом является сортировка по «расстоянию» от вашего идеального значения или идеального диапазона.

Например, если вам известны фиксированные значения (a и b) для категорий A и B, но вы хотите найти значения для категории C, предпочитая значения, наиболее близкие к 'idealC', тогда вы можете сделать

SELECT 
   A, B, C,... FROM YorData 
WHERE
   CategoryA=a AND CategoryB=b 
ORDER BY abs(C-<idealC>)

Если вам нужна только одна подходящая строка, добавьте «LIMIT 1» к запросу.

Вы можете расширить это, чтобы работать с диапазоном. Чтобы рассматривать диапазон значений для категории C как «идеальный», но также находить строки, которые находятся вне этого, вы изменяете порядок по выражению на

ORDER BY LEAST(C-maxC, minC-C)

(где minC / maxC определяют диапазон значений, которые вас больше всего интересуют.)

Сначала будут созданы строки в пределах диапазона, а затем строки вне диапазона. Как и раньше, вы можете использовать LIMIT 1 для выборки только одной строки.

1 голос
/ 16 мая 2010

Вам необходимо создать процедуру или функцию, как указано ниже, может легко решить вашу проблему

create procedure GetPeople
     @condition varchar(max)
    as 

    begin
    declare @affectRec int

    SET @ParmDefinition = N'@cound nvarchar(max), @cout int output';

      declare @@query nvarchar(max)
      set @query= 'select * from people where  @cond;  set @cout=@@rowcount'

      exec @query

     EXECUTE sp_executesql
@query
,@ParmDefinition
,@cond = @condition
,@count = @affectRec output
;


      if @affectRec > 0
      begin
       return;
      end 
      else 
      begin
       //update condition code 
       exec GetPeople(condition)
      end  

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...