MySQL Views: Referencing one calculated field (by name) in another calculated field

calculated-columns, mysql, sql, sql-view

Solution

Since subqueries are not allowed in views, you will need to simulate them by creating multiple views.

For example, this query will solve your issue if directly executed:

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;

According to the MySQL documentation views have the restriction on not being able to contain subqueries in the FROM clause. To work around this limitation and turn this query into a view, break it up into 3 views (one for each subquery) with the last giving the desired combination of fields:

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;

Problem

How can I define a view that has two calculated fields, for instance... ``` ('TableName'.'BlueSquares' + 'TableName'.'RedSquares') AS TotalSquares, ('TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalCircles ``` ... and create a third calculated field that's based on the first two calculated fields, as in... ``` ('ViewName'.'TotalSquares' + 'ViewName'.'TotalCircles') AS TotalShapes ``` ...? When I reference the first two calculated fields by name, I get a message that the fields are unknown. Thanks!

Original source