MySQL:在FROM子句限制中使用SubQuery查看

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (9)

在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
提问于
用户回答回答于

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

用户回答回答于

我也有同样的问题。我想要创建一个视图,以显示最近一年的信息,从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

解决办法概要:

  1. 为每个子查询创建一个视图
  2. 用这些视图替换子查询

以下是解决方案查询:

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相比)。

扫码关注云+社区