MySQL:在FROM子句限制中使用子查询进行查看

在MySQL 5.0中,当试图在FROM子句中使用子查询创build视图时,为什么会出现以下错误?

错误1349(HY000):视图的SELECT包含FROM子句中的子查询

如果这是MySQL引擎的限制,那为什么他们没有实现这个function呢?

另外,这个限制有什么好的解决方法?

是否有任何解决方法适用于FROM子句中的任何子查询,还是有一些查询无法在FROM子句中使用子查询来表示?


一个示例查询(被埋在评论中):

SELECT temp.UserName FROM (SELECT u1.name as UserName, COUNT(m1.UserFromId) as SentCount FROM Message m1, User u1 WHERE u1.uid = m1.UserFromId Group BY u1.name HAVING SentCount > 3 ) as temp 

无法将您的评论中的查询写为:

 SELECT u1.name as UserName from Message m1, User u1 WHERE u1.uid = m1.UserFromID GROUP BY u1.name HAVING count(m1.UserFromId)>3 

这也应该有助于解决MySQL中已知的子查询速度问题

我有同样的问题。 我想创build一个视图来显示最近一年的信息,从2009年到2011年的logging表。以下是原始查询:

 SELECT a.* FROM a JOIN ( SELECT a.alias, MAX(a.year) as max_year FROM a GROUP BY a.alias ) b ON a.alias=b.alias and a.year=b.max_year 

解决scheme概述:

  1. 为每个子查询创build一个视图
  2. 用这些视图replace子查询

以下是解决scheme查询:

 CREATE VIEW v_max_year AS SELECT alias, MAX(year) as max_year FROM a GROUP BY a.alias; CREATE VIEW v_latest_info AS SELECT a.* FROM a JOIN v_max_year b ON a.alias=b.alias and a.year=b.max_year; 

它在MySQL 5.0.45上工作正常,没有太多的速度损失(与执行原始子查询select没有任何意见相比)。

这似乎是一个已知的问题。

http://dev.mysql.com/doc/refman/5.1/en/unnamed-views.html

http://bugs.mysql.com/bug.php?id=16757

许多IN查询可以被重写为(左外)连接和某种IS(NOT)NULL。 例如

 SELECT * FROM FOO WHERE ID IN (SELECT ID FROM FOO2) 

可以重写为

 SELECT FOO.* FROM FOO JOIN FOO2 ON FOO.ID=FOO2.ID 

要么

 SELECT * FROM FOO WHERE ID NOT IN (SELECT ID FROM FOO2) 

 SELECT FOO.* FROM FOO LEFT OUTER JOIN FOO2 ON FOO.ID=FOO2.ID WHERE FOO.ID IS NULL 

您可以通过为要使用的任何子查询创build一个单独的VIEW,然后join到您创build的VIEW中来解决此问题。 这是一个例子: http : //blog.gruffdavies.com/2015/01/25/a-neat-mysql-hack-to-create-a-view-with-subquery-in-the-from-clause/

这很方便,因为无论如何,您都可能要重复使用它,并帮助您保持SQL干燥。

为每个子查询创build一个视图是要走的路。 得到它像一个魅力工作。