在 MySQL 5.0 中,为什么在 FROM 子句中尝试使用子查询创建 View 时会出现以下错误?
ERROR 1349 (HY000): View's SELECT contains a subquery in the FROM clause
如果这是 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
最佳答案
我遇到了同样的问题。我想创建一个 View 来显示最近一年的信息,从一个包含 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
解决方案大纲:
- 为每个子查询创建一个 View
- 用这些 View 替换子查询
这是解决方案查询:
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 上运行良好,没有太大的速度损失(与执行相比 没有任何 View 的原始子查询选择)。
关于MySQL:在 FROM 子句限制中使用子查询查看,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/206062/