首先,如果有人有更好的头衔,请帮助。
如果我让我们说'日历'表格带有'日'列。我有以下问题:
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
但我正在努力避免浪费。如果我别无选择,那就是我要做的。
答案 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);
此解决方案在大多数情况下有助于压缩查询,但我还不知道它如何影响性能。