在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
发布于 2008-10-15 19:54:20
你的查询不能写成:
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中子查询的已知速度问题
发布于 2010-08-19 17:48:50
我也有同样的问题。我想创建一个视图来显示最近一年的信息,该视图来自一个包含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相比)。
发布于 2008-10-15 19:38:02
这似乎是一个已知的问题。
http://dev.mysql.com/doc/refman/5.1/en/unnamed-views.html
http://bugs.mysql.com/bug.php?id=16757
许多IN查询可以重写为(左外)连接和某种类型的IS (非) 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
https://stackoverflow.com/questions/206062
复制相似问题