视图的SELECT在FROM子句中包含一个子查询

我有两个表,我需要创build一个视图。 这些表格是:

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

我使用下面的查询来做到这一点。 没有“创build视图”部分的查询工作正常,但使用“创build视图”,它显示错误“视图的SELECT包含FROM子句中的子查询”。 可能是什么问题和可能的解决scheme:

 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文档

  • SELECT语句不能在FROM子句中包含子查询。

您的解决方法是为每个子查询创build一个视图。

然后在视图view_credit_status访问这些视图

 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) 

正如最近关于视图限制的 MySQL文档所说:

在MySQL 5.7.7之前,子查询不能用在视图的FROM子句中。

这意味着,selectMySQL v5.7.7或更高版本或将现有MySQL实例升级到这样的版本,将完全消除对视图的限制。

但是,如果你有一个早于v5.7.7的生产MySQL版本,那么删除对视图的这个限制应该只是在作出决定时要评估的标准之一。 使用其他答案中描述的解决方法技术可能是更可行的解决scheme – 至less在短期内。

在我看来,MySQL 3.6给出了以下错误,而MySQL 3.7不再出错。 我还没有find有关此修复的文档中的任何内容。