mysql - 在UNION之后引用别名以进行计算

时间:2014-11-12 17:48:56

标签: mysql union

好的,这是查询(伪查询):

SELECT *, (t1.field + t2.field) as 'result', (t1.field * t2.field) as result2 from((select as t1 limit 1) UNION ALL (select as t2 limit 1))

我需要返回两行,然后将两个字段的数学运算到结果别名中。我知道它并不优雅,但我必须将两个问题联合起来(第一个是联盟,第二个是数学)

那么,我如何引用和使用这两个内部别名?外部选择不能访问内部别名。

我怀疑这里有一个明显的解决方案,就是我的大脑不见了。

2 个答案:

答案 0 :(得分:1)

将两个语句组合在一起时,结果就是单个结果集。你将建立什么:

FROM
    (
        (SELECT f1, f2 FROM table1 LIMIT 1)
        UNION
        (SELECT g1, g2 FROM table2 LIMIT 1)
    ) derived_table_1

这将为您提供一个名为derived_table_的结果集,其中包含两个分别名为f1f2的字段。将有两行,一行来自您的第一个SELECT语句,另一行来自您的第二行。您在UNION查询中分配的表别名不再可引用。它们仅存在于自己的SELECT语句中。

如果您在Table1和Table2之间有关系,那么您需要在此处加入:

SELECT
   t1.f1 + t2.g1 as result1,
   t1.f2 + t2.g2 as result2,
FROM
    table1 as t1
    INNER JOIN table2 as t2 ON
        t1.f1 = t2.g1

如果没有关系存在,那么你可能正在寻找原始的,与kludgy,在SELECT中与SUM结合:

SELECT
    sum(derived_table_1.f1) as result,
    sum(derived_table_1.f2) as result2
FROM
    (
        (SELECT f1, f2 FROM table1 LIMIT 1)
        UNION
        (SELECT g1, g2 FROM table2 LIMIT 1)
    ) derived_table_1

编辑以使用最后一个示例添加SQLFIDDLE:http://sqlfiddle.com/#!2/c8707/10

答案 1 :(得分:0)

UNION结果的列名或别名始终由第一个查询确定。将忽略在union的后续查询中定义的列名或别名。

演示:

mysql> create table foo ( a int, b int, c int );
mysql> insert into foo values (1,2,3);

mysql> create table bar (x int, y int, z int);
mysql> insert into bar values (4,5,6);

mysql> select a, b, c from (select a, b, c from foo union select x, y, z from bar) as t;
+------+------+------+
| a    | b    | c    |
+------+------+------+
|    1 |    2 |    3 |
|    4 |    5 |    6 |
+------+------+------+

mysql> select x from (select a, b, c from foo union select x, y, z from bar) as t;
ERROR 1054 (42S22): Unknown column 'x' in 'field list'