使用子查询定义和使用变量?

时间:2015-05-27 22:35:06

标签: mysql correlated-subquery mysql-5.5 user-variables

我通常知道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。或者我可以写两个单独的查询。但那些人不回答我的问题,即是否可以在查询和子查询中安全地定义和使用相同的变量。

1 个答案:

答案 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,因此数据被多次读写。