View's SELECT contains a subquery in the FROM clause

MysqlSqlDatabaseViews

Mysql Problem Overview


I have two tables and I need to create a view. The tables are:

credit_orders(id, client_id, number_of_credits, payment_status)
credit_usage(id, client_id, credits_used, date)

I use the following query to do this. The query without the "create view" part works well but with "create view", it shows the error "View's SELECT contains a subquery in the FROM clause". What could be the issue & possible solution:

create view view_credit_status as 
(select credit_orders.client_id, 
        sum(credit_orders.number_of_credits) as purchased, 
        ifnull(t1.credits_used,0) as used 
 from credit_orders
 left outer join (select * from (select credit_usage.client_id, 
                                        sum(credits_used) as credits_used 
                                 from credit_usage 
                                 group by credit_usage.client_id) as t0
                  ) as t1 on t1.client_id = credit_orders.client_id
 where credit_orders.payment_status='Paid'
 group by credit_orders.client_id)

Mysql Solutions


Solution 1 - Mysql

As per documentation:

MySQL Docs

  • The SELECT statement cannot contain a subquery in the FROM clause.

Your workaround would be to create a view for each of your subqueries.

Then access those views from within your view view_credit_status

Solution 2 - Mysql

create view view_clients_credit_usage as
	select client_id, sum(credits_used) as credits_used 
	from credit_usage 
	group by client_id

create view view_credit_status as 
	select 
		credit_orders.client_id, 
		sum(credit_orders.number_of_credits) as purchased, 
		ifnull(t1.credits_used,0) as used 
	from credit_orders
	left outer join view_clients_credit_usage as t1 on t1.client_id = credit_orders.client_id
	where credit_orders.payment_status='Paid'
	group by credit_orders.client_id)

Solution 3 - Mysql

As the more recent MySQL documentation on view restrictions says:

> Before MySQL 5.7.7, subqueries cannot be used in the FROM clause of a view.

This means, that choosing a MySQL v5.7.7 or newer or upgrading the existing MySQL instance to such a version, would remove this restriction on views completely.

However, if you have a current production MySQL version that is earlier than v5.7.7, then the removal of this restriction on views should only be one of the criteria being assessed while making a decision as to upgrade or not. Using the workaround techniques described in the other answers may be a more viable solution - at least on the shorter run.

Solution 4 - Mysql

Looks to me as MySQL 3.6 gives the following error while MySQL 3.7 no longer errors out. I am yet to find anything in the documentation regarding this fix.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRaouf AtharView Question on Stackoverflow
Solution 1 - MysqlNonymView Answer on Stackoverflow
Solution 2 - MysqlMichał PowagaView Answer on Stackoverflow
Solution 3 - MysqlShadowView Answer on Stackoverflow
Solution 4 - Mysqluser3809638View Answer on Stackoverflow