2013-06-12 1 views
0

Я пытаюсь получить верхнюю половину записей, под флагом которого поле равно 1. Я попытался с помощью переменного держать предельное значение как вSQL запросы - предел на основе подзапрос

set @v1:=(select ceil(count(*)/2) as top_half from my_table 
where flagged=1); 

select * from my_table where flagged=1 order by 21_day_probability limit @v1; 

Но это не Работа. Какие-либо предложения?

Благодаря

ответ

1

Как указано под SELECT Синтаксис:

Предложение LIMIT может использоваться для ограничения количества строк, возвращаемых SELECT заявление. LIMIT принимает один или два числовых аргумента, которые должны быть оба неотрицательные целые константы, со следующими исключениями:

  • В подготовленных операторов, LIMIT параметры могут быть заданы с помощью маркеров ? заполнителей.

  • Внутри хранимых программ параметры LIMIT могут быть заданы с использованием переменных или локальных переменных с использованием целочисленных значений.

Поэтому LIMIT параметры не могут быть user-defined variables. Ваши варианты, как указано выше, должны использовать:

  1. подготовленные заявления

    PREPARE stmt FROM ' 
        select * from my_table where flagged=1 order by 21_day_probability limit ? 
    '; 
    EXECUTE stmt USING @v1; 
    DEALLOCATE PREPARE stmt; 
    
  2. параметр,/локальная переменная в хранимой программы:

    CREATE PROCEDURE foo(_l INT) 
        select * from my_table where flagged=1 order by 21_day_probability limit _l 
    ; 
    CALL foo(@v1); 
    
+0

Спасибо очень – user1893354

+0

OK Теперь мне нужно сделать это, не объявляя переменную. Это возможно? – user1893354

+0

@ user1893354: Как вы это понимаете? Используя второй метод, описанный выше, можно вызвать CALL foo (123); '. – eggyal

Смежные вопросы