我通常知道https://github.com/stripe/jquery.payment/pull/123/files?short_path=04c6e90因此我们无法在同一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
。或者我可以写两个单独的查询。但那些人不回答我的问题,即是否可以在查询和子查询中安全地定义和使用相同的变量。
答案 0 :(得分: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
,因此数据被多次读写。