2013-03-27 2 views
1

Могу ли я использовать переменную I, заданную в операторе select?Использовать переменные, заданные в операторе select

Я хочу сделать что-то вроде этого (что, очевидно, не работает):

SELECT 
    YEAR(date_of_spend), 
    @current := SUM(spend_amount), 
    @half := (SUM(spend_amount)/2), 
    (@current - @half) 
FROM `sales_data` 
GROUP BY YEAR(date_of_spend) 

ответ

1

No. Согласно тузд инструкции:

Как правило, вы не должны присвоить значение переменной пользователя и прочитать значение в том же заявлении. Вы можете получить ожидаемые результаты, но это не гарантируется. Порядок оценки для выражений, включающих пользовательские переменные, не определен, и может изменяться на основе элементов, содержащихся в данном операторе; Кроме того, этот заказ не гарантируется на уровне выпусков MySQL Server.

http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

Вам нужно еще раз повторить выражения или использовать подзапрос

+0

Выполняет ли MySQL вычисления дважды? – Petah

+0

Это не документированная оптимизация, поэтому я не стал бы на нее рассчитывать, тем более, что большая сосредоточенность на оптимизации лежит обычно на объединениях. Это не должно быть сложно проверить. У вас также есть возможность использовать подзапрос, который позволит избежать двойных вычислений, но может потребоваться больше памяти (зависит также от оптимизатора). – koriander

-1

Просто необходимо установить их:

SELECT 
    YEAR(date_of_spend), 
    @current := SUM(spend_amount), 
    @half := (SUM(spend_amount)/2), 
    (@current - @half) 
FROM `sales_data`, 
    (SELECT @current := 0, @half := 0) r 
GROUP BY YEAR(date_of_spend) 

See the demo.

+0

Это просто делает '@current - @ half' возвращения 0. Они устанавливаются в строках 3 и 4. – Petah

+1

@Petah Взгляните [на эту демонстрацию] (http://sqlfiddle.com/#!2/19182/3). – Kermit

+0

Да, я знаю, изменился ли я на использование функции вместо переменной, которая будет работать. Однако это упрощенный пример, и расчет на практике намного больше. – Petah