MySQL视图:在另一个计算字段中引用一个计算字段(按名称)

4

我该如何定义一个视图,其中包含两个计算字段,例如...

 ('TableName'.'BlueSquares' + 'TableName'.'RedSquares') AS TotalSquares, ('TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalCircles

...并创建第三个计算字段,该字段基于前两个计算字段,如下所示...

 ('ViewName'.'TotalSquares' + 'ViewName'.'TotalCircles') AS TotalShapes

当我按名称引用前两个计算字段时,会收到未知字段的消息。

谢谢!

3个回答

4

由于视图中不允许使用子查询,因此您需要通过创建多个视图来模拟它们。

例如,如果直接执行此查询,它将解决您的问题:

SELECT 
    TotalCircles + TotalSquares AS TotalShapes
FROM
    (SELECT 
        BlueCirles + RedCircles AS TotalCircles,
        BlueSquares + RedSquares AS TotalSquares
    FROM
        (SELECT
            2 AS BlueCirles,
            3 AS RedCircles,
            4 AS BlueSquares,
            5 AS RedSquares
        ) AS shapes
    ) as totals;

根据MySQL文档的说明,视图无法在FROM子句中包含子查询。为了克服这个限制并将此查询转换为视图,请将其分解成3个视图(每个子查询一个),其中最后一个视图提供所需的字段组合:

CREATE VIEW shapes AS
SELECT
    2 AS BlueCirles,
    3 AS RedCircles,
    4 AS BlueSquares,
    5 AS RedSquares;

CREATE VIEW totals AS
SELECT 
    BlueCirles + RedCircles AS TotalCircles,
    BlueSquares + RedSquares AS TotalSquares
FROM
    shapes;

CREATE VIEW result AS
SELECT 
    TotalCircles + TotalSquares AS TotalShapes
FROM
    totals;

SELECT * FROM result;

1
如果你尝试这样做,你会发现它会导致SQL错误。这是因为“SELECT语句不能在FROM子句中包含子查询。”请参考:http://dev.mysql.com/doc/refman/5.0/en/create-view.html - Conspicuous Compiler
我在测试我的初始答案时注意到了这一点。我已经更新了它,使用多个视图来模拟子查询。 - Adam Franco
感谢您在这方面付出了如此多的努力,我非常感激。 - Alan M.

2

...创建第三个计算字段,该字段基于前两个计算字段...

正如您所发现的那样,在同一SELECT中无法引用计算列。您有以下选项:

复制逻辑

由于某种奇怪的原因,MySQL不支持视图中的子查询:

CREATE OR REPLACE VIEW your_view AS
SELECT t.BlueSquares + t.RedSquares AS TotalSquares, 
       t.BlueCirles + t.RedCircles AS TotalCircles,
       t.BlueSquares + t.RedSquares + t.BlueCirles + t.RedCircles AS TotalShapes
  FROM TABLE t

分层视图

最不推荐的选项...


(注:该段内容已经是中文,无需翻译)
 CREATE OR REPLACE VIEW initial_view AS
    SELECT t.BlueSquares + t.RedSquares AS TotalSquares, 
           t.BlueCirles + t.RedCircles AS TotalCircles,
      FROM TABLE

 CREATE OR REPLACE VIEW layered_view AS
    SELECT iv.TotalSquares + iv.TotalCircles AS TotalShapes
      FROM initial_view iv

2
很抱歉,您正在尝试的方法实际上是不可能的。一般来说,MySQL视图可以被看作是一个脚本化的SELECT查询语句。视图的结果并不会与其源数据分开存储在数据库中,而是在引用视图时进行计算。
大多数情况下,当您从一个视图中进行SELECT查询时,MySQL使用合并算法。这意味着它将视图的定义和引用该视图的SELECT语句合并起来创建一个最终的SELECT查询语句。因此,您无法让一个视图引用自身。
您的选择是(1)定义第二个视图,该视图引用第一个视图以创建您的总和,或者(2)像这样手动编写总和的查询语句:
('TableName'.'BlueSquares' + 'TableName'.'RedSquares' + 'TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalShapes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接