Ray*_*low 4 mysql subquery alias
我目前有一个查询,我正在执行两个子查询来获取 X、Y 数据:
SELECT
t.series AS week,
( ... ) X,
( ..., AND ... ) Y,
ROUND(( ... ) * 100) / ( ..., AND ... ), 2) Z
FROM series_tmp t
Run Code Online (Sandbox Code Playgroud)
Y 是 X 的子集,因为我只对现有条件应用一个附加条件,如果 X 是:
SELECT COUNT(*)
FROM t1
INNER JOIN t2
ON t2.id = t1.another_id
WHERE t2.something = 1
AND t1.date BETWEEN t.series AND t.series + INTERVAL 6 DAY
Run Code Online (Sandbox Code Playgroud)
那么 Y 还有一个附加的 AND 条件:
SELECT COUNT(*)
FROM t1
INNER JOIN t2
ON t2.id = t1.another_id
WHERE t2.something = 1
AND t1.date BETWEEN t.series AND t.series + INTERVAL 6 DAY
AND t1.some_state = 'x state'
Run Code Online (Sandbox Code Playgroud)
对于 XI 的值,需要获取这两个结果 - X 和 Y 并进行一些计算。由于我无法使用别名,因此我必须使用子查询,对吗?但在这种情况下,这似乎太多了。
有没有办法重用这些子查询?好像是有太多相同的地方了。
我使用的是 MySQL 5.6,所以我无法使用 CTE :(
PS:series_tmp来自这个美妙的想法(感谢他们)。
SQL 标准不允许在此处重用别名。
然而,MySQL 使用标准的扩展,使您能够执行类似的操作,即在子查询中使用先前定义的别名:
select some_expression as alias_name, (select alias_name)
Run Code Online (Sandbox Code Playgroud)
在你的情况下这意味着你可以做
SELECT
t.series AS week,
( ... ) X,
( ... AND ... ) Y,
ROUND( (select X) * 100) / (select Y), 2) Z
FROM series_tmp t
Run Code Online (Sandbox Code Playgroud)
别名不应与列名匹配,因为这会优先,并且它不适用于聚合。与nbk 的答案类似,这是特定于 MySQL 的,不适用于其他数据库系统。
一个也适用于其他数据库系统的解决方案,根据您的评论,您已经找到了,将引入一个派生表,例如
select week, X, Y, ROUND(X * 100 / Y, 2) Z
from (
SELECT
t.series AS week,
( ... ) X,
( ..., AND ... ) Y
FROM series_tmp t
) as sub
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5176 次 |
| 最近记录: |