首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MySQL:在FROM子句限制中使用子查询的视图

MySQL:在FROM子句限制中使用子查询的视图
EN

Stack Overflow用户
提问于 2008-10-15 19:25:51
回答 5查看 119.2K关注 0票数 60

在MySQL 5.0中,当试图在FROM子句中创建一个带有子查询的视图时,为什么会出现以下错误?

错误1349 (HY000):视图的SELECT在FROM子句中包含子查询

如果这是MySQL引擎的一个限制,那么为什么他们还没有实现这个特性呢?

另外,对于这个限制,有什么好的解决办法?

是否有适用于FROM子句中的任何子查询的变通方法,或者是否有一些查询在FROM子句中不使用子查询就无法表达?

一个示例查询(隐藏在注释中):

代码语言:javascript
复制
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
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-10-15 19:54:20

你的查询不能写成:

代码语言:javascript
复制
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中子查询的已知速度问题

票数 18
EN

Stack Overflow用户

发布于 2010-08-19 17:48:50

我也有同样的问题。我想创建一个视图来显示最近一年的信息,该视图来自一个包含2009到2011年记录的表。以下是原始查询:

代码语言:javascript
复制
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. 使用这些视图为每个subquery
  2. replace子查询创建一个视图

下面是解决方案查询:

代码语言:javascript
复制
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相比)。

票数 83
EN

Stack Overflow用户

发布于 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。例如

代码语言:javascript
复制
SELECT * FROM FOO WHERE ID IN (SELECT ID FROM FOO2)

可以重写为

代码语言:javascript
复制
SELECT FOO.* FROM FOO JOIN FOO2 ON FOO.ID=FOO2.ID

代码语言:javascript
复制
SELECT * FROM FOO WHERE ID NOT IN (SELECT ID FROM FOO2)

可以是

代码语言:javascript
复制
SELECT FOO.* FROM FOO 
LEFT OUTER JOIN FOO2 
ON FOO.ID=FOO2.ID WHERE FOO.ID IS NULL
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/206062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档