在MySQL 5.0中,为什么在尝试使用FROM子句中的子查询创建视图时会发生以下错误?
错误1349(HY000):视图的SELECT包含FROM子句中的子查询
如果这是MySQL引擎的限制,为什么他们还没有实现这个功能呢?
此外,这个限制有哪些好的解决方法?
是否有任何变通方法适用于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
小智.. 80
我有同样的问题.我想创建一个视图来显示最近一年的信息,从2009年到2011年的记录表.这是原始查询:
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
解决方案概要:
为每个子查询创建一个视图
用这些视图替换子查询
这是解决方案查询:
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上工作正常,没有太多的速度惩罚(与执行没有任何视图的原始子查询选择相比).
我有同样的问题.我想创建一个视图来显示最近一年的信息,从2009年到2011年的记录表.这是原始查询:
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
解决方案概要:
为每个子查询创建一个视图
用这些视图替换子查询
这是解决方案查询:
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 u1.name as UserName from Message m1, User u1 WHERE u1.uid = m1.UserFromID GROUP BY u1.name HAVING count(m1.UserFromId)>3
这也应该有助于解决MySQL中子查询的已知速度问题
这似乎是一个已知问题.
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