2015-05-27 3 views
0

Я знаю нормально "the order of evaluation for expressions involving user variables is undefined", поэтому мы не можем безопасно определить и использовать переменную в том же самом заявлении select. Но что, если есть подзапрос? В качестве примера, у меня есть что-то вроде этого:Определить и использовать переменную с подзапросом?

select col1, 
     (select min(date_)from t where i.col1=col1) as first_date, 
     datediff(date_, (select min(date_)from t where i.col1=col1) 
       ) as days_since_first_date, 
     count(*) cnt 
from t i 
where anothercol in ('long','list','of','values') 
group by col1,days_since_first_date; 

Есть ли способ использовать (select @foo:=min(date_)from t where i.col1=col1) безопасно вместо повторения подзапрос? Если да, могу ли я сделать это в функции datediff или в первый раз, когда появляется подзапрос (или один)?


Конечно, я мог бы сделать

select col1, 
     (select min(date_)from t where i.col1=col1) as first_date, 
     date_, 
     count(*) cnt 
from t i 
where anothercol in ('long','list','of','values') 
group by col1,date_; 

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

+1

Эта ссылка может быть вам полезной. http://stackoverflow.com/questions/16715504/mysql-define-a-variable-within-select-and-use-it-within-the-same-select –

ответ

1

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

Это, пожалуйста, может повторить подзапрос, но я не понимаю, зачем это нужно. Просто используйте подзапрос:

select t.col1, t.first_date, 
     datediff(date_, first_date), 
     count(*) 
from (select t.*, (select min(date_) from t where i.col1 = t.col1) as first_date 
     from t 
     where anothercol in ('long','list', 'of', 'values') 
    ) t 
group by col1, days_since_first_date; 

Как я уже упоминал, значение третьей колонки проблематично.

Примечание: для материализации подзапроса на это возникают дополнительные накладные расходы. Однако в любом случае существует group by, поэтому данные считываются и записываются несколько раз.

+0

Re группировки и агрегации, примечание что я группируюсь на 'days_since_first_date', что является взаимно однозначным соответствием для каждого' col1' с 'date_', а также' col1'. Поэтому группировка должна быть прекрасной. – JQKP

+0

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

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