MySQL:在select本身中使用select中的值

时间:2012-01-29 11:26:57

标签: mysql sql aggregate-functions

首先,如果有人有更好的头衔,请帮助。

如果我让我们说'日历'表格带有'日'列。我有以下问题:

SELECT day, day AS testDay, testDay AS test2Day FROM calendar

MySQL会抱怨“testDay”是一个未知的列。当然你会告诉我这句话没用,但我的陈述看起来更像是这样:

SELECT day, SOME_CRAZY_EXPRESSION_OF(day) AS testDay, EXPRESSION_OF(testDay) AS test2Day FROM calendar

关键是我不想评估第一个表达式的两倍,以便在第二个表达式中使用它。那么有没有办法使用select中计算的值作为select本身的一部分?

我当然能做到:

SELECT day, SOME_CRAZY_EXPRESSION_OF(day) AS testDay, EXPRESSION_OF(SOME_CRAZY_EXPRESSION_OF(day)) AS test2Day FROM calendar

但我正在努力避免浪费。如果我别无选择,那就是我要做的。

2 个答案:

答案 0 :(得分:10)

在MySQL中,你需要为表达式的值分配一个临时变量才能重用它,这应该这样做;

SELECT day, @tmp:=SOME_CRAZY_EXPRESSION_OF(day) AS testDay, 
    EXPRESSION_OF(@tmp) AS test2Day FROM calendar

有关性能影响的更多分析,请参阅this page以获取另一个示例。

答案 1 :(得分:2)

所以,你不能使用变量,因为它们包含上一行的值(来自官方文档:https://dev.mysql.com/doc/refman/5.0/en/user-variables.html):

SELECT (@aa:=id) AS a, (@aa+3) AS b FROM tbl_name HAVING b=5;
  

HAVING子句中对b的引用是指a的别名   使用@aa的选择列表中的表达式。这不起作用   预期:@aa包含上一个选定行的id值,   不是从当前行

这就是为什么我建立了一个基于代码片段的临时解决方案。 我将在PHP中展示一个例子:

$querySubstitutions = array(
      '%days%' => 'TO_DAYS(table.started_at + INTERVAL (table.period - 1) DAY)'
    );

$query = 'SELECT %days% AS days, <EXPRESSION_OF( %days% )> FROM table';

// Replacing pairs in a query
$query = strtr($query, $querySubstitutions);

此解决方案在大多数情况下有助于压缩查询,但我还不知道它如何影响性能。