2012-04-09 2 views
0

Вот запрос я пытаюсь написать:Можете ли вы назначить переменную в SELECT, а затем использовать ее позже в том же SELECT?

SELECT I.*, 
     IF(MAX(B.`amount`) != 0, MAX(B.`amount`), I.`start`) AS `current_bid`, 
     `current_bid` * 1.05 AS `min_bid` 
     ... 

Я получаю ошибку «Неизвестный столбец" CURRENT_BID». Я предполагаю, что это потому, что я только что создал текущий столбец в строке раньше. Есть ли способ заставить этот запрос работать так, как я этого хочу? Я предполагаю, что один из способов заставить его работать было бы использовать два, если заявления, которые говорят в основном то же самое, как это:

SELECT I.*, 
     IF(MAX(B.`amount`) != 0, MAX(B.`amount`), I.`start`) AS `current_bid`, 
     IF(MAX(B.`amount`) != 0, MAX(B.`amount`) * 1.05, I.`start` * 1.05) AS `min_id` 
     ... 

Но это кажется ужасно неэффективным.

Кроме того, есть ли способ, которым я могу назначить current без вычисления MAX(B.amount) дважды?

ответ

2
SELECT 
    C.CURRENT_BID, 
    C.CURRENT_BID * 1.05 AS MIN_BID 
FROM 
    (
     SELECT MAX(B.AMOUNT) AS CURRENT_BID FROM ... 
    ) C 

Я уверен, что вложенные запросы выполняются сначала, так что вы можете использовать их результаты. В то время как разные столбцы в одном и том же запросе рассматриваются как параллельные, поэтому вы не можете сделать их зависимыми друг от друга.

+0

Вы избили меня ... Я думаю, что это единственный способ. Кажется странным, однако, почему SQL не имеет встроенного способа для псевдонимов столбца. – McGarnagle

0

Вы не можете ссылаться на current_bid или любую колонку с псевдонимом в другой колонке. Есть два способа сделать это:

  1. скопировать весь расчет, когда вы хотите использовать это значение (наиболее эффективным, менее читаемый)
  2. Вы используете производную таблицу (менее эффективный, более удобную для чтения)

в последнем случае вы должны сделать что-то вроде:

select current_bid from (
    IF(MAX(B.`amount`) != 0, MAX(B.`amount`), I.`start`) AS `current_bid`... 
) s 

я хотел бы сделать акцент, что производная таблица будет выполнять сканирование всех строк, и это будет меньше эффективный. В большинстве случаев лучше скопировать формулу.

PS: Если вы собираетесь за первый вариант, обратите внимание, что вы можете написать свой второй IF таким образом:

IF(MAX(B.`amount`) = 0, I.`start`, MAX(B.`amount`)) * 1.05 `min_id` 

Который является немного более удобным для чтения.