MySQL ERROR 1349我缺少什么?

时间:2013-08-01 00:38:06

标签: mysql sql view subquery

我收到MySQL 1349错误,但似乎错误不正确:

ERROR 1349: View's SELECT contains a subquery in the FROM clause

创建视图时是否可以没有任何子查询?

这是我的SQL:

CREATE VIEW  `wordpress`.`ffi_be_v_book_details` AS (
  SELECT ffi_be_courses. * , COALESCE(  `Total` , 0 ) AS  `Total` 
  FROM  `ffi_be_courses` 
  LEFT JOIN (
    SELECT * , COUNT(  `Course` ) AS  `Total` 
    FROM ffi_be_courses
    RIGHT JOIN (
      SELECT  `Course` 
      FROM  `ffi_be_bookcourses` 
      LEFT JOIN  `ffi_be_sale` ON ffi_be_bookcourses.SaleID = ffi_be_sale.SaleID
      WHERE DATE_ADD( ffi_be_sale.Upload, INTERVAL( 
        SELECT  `BookExpireMonths` 
        FROM  `ffi_be_settings` ) MONTH ) > CURDATE( ) AND ffi_be_sale.Sold =  '0'
      GROUP BY ffi_be_bookcourses.SaleID
    ) AS  `q1` ON ffi_be_courses.Code = q1.Course
    GROUP BY q1.Course
  ) AS  `q2` ON ffi_be_courses.Code = q2.Code
  WHERE ffi_be_courses.Type =  'Arts'
  ORDER BY ffi_be_courses.Name ASC
)

感谢您的时间。

3 个答案:

答案 0 :(得分:3)

您错过了MySQL中的视图不允许from子句中的子查询这一事实。但是,selectwhere以及having条款允许这样做。

documentation非常明确:

  

子视图不能在视图的FROM子句中使用。

在您的情况下,您可以将from子句重写为select子句中的相关子查询。您还可以使用多个视图层来执行所需的操作。

编辑:

SQL中的SELECT语句具有以下子句:SELECTFROMWHEREGROUP BYHAVINGORDER BY(根据标准)。此外,MySQL添加了LIMITINTO OUTFILE之类的内容。您可以通过MySQL描述documentation中的SELECT子句的方式来看到这一点。您也可以在几乎所有数据库的文档中看到这一点。

join这样的操作是FROM子句的一部分(同样WITH ROLLUPGROUP BY的一部分而DESCORDER BY的一部分}})。这些似乎是一种神秘的句法惯例,但是当存在上述限制时它变得很重要。

混淆的一个原因可能是缩进样式:

select . . .
from t1
inner join t2
     on . . .

连接语句在select下排列。这是误导。我会把它写成:

select 
from t1 join
     t2
     on . . .

只有select条款排在select.

答案 1 :(得分:3)

以上答案是正确的。 MySQL 5.5不允许FROM子句中的子查询。但是,现在允许在MySQL 5.7.7及更高版本中使用它。

答案 2 :(得分:0)

请参阅documentation -

视图定义受以下限制:

SELECT语句不能在FROM子句中包含子查询。

为每个FROM子句创建一个单独的视图。