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

标签 mysql sql view mysql-error-1349

在 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

解决方案大纲:

  1. 为每个子查询创建一个 View
  2. 用这些 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/

相关文章:

mysql - 如何更新查询两张表并更新一张表?

javascript - 动态添加的view没有样式功能React Native

templates - GRAILS:我可以从 _FORM.GSP 模板调用服务逻辑吗?

android - 如何在 Android 中正确重用 Animation?

mysql - go-sql-driver/mysql - 将 float64 插入 mariadb(双列)给出不受支持的类型 func() float64,一个 func

mysql - OrientDB 变压器 'jdbc' 未找到

mysql - 如何在mysql中找到每天最好的球员

php - 有什么关于 php 代码的想法吗?

c# - 没有结果的 EF6 存储过程

mysql - 'order clause' 中的未知列