MySQL 错误 1349 我缺少什么?

Oli*_*ryn 2 mysql sql view subquery

我收到 MySQL1349错误,但该错误似乎不正确:

ERROR 1349: View's SELECT contains a subquery in the FROM clause
Run Code Online (Sandbox Code Playgroud)

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

这是我的 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
)
Run Code Online (Sandbox Code Playgroud)

感谢您的时间。

Gor*_*off 5

您忽略了 MySQL 中的视图不允许在from子句中使用子查询的事实。但是,它们可以出现在selectandwherehaving子句中。

文档非常清楚:

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

对于您的情况,您可以将该from子句重写为子句中的相关子查询select。您还可以使用多层视图来执行您想要的操作。

编辑:

SQL 中的 SELECT 语句具有以下子句: SELECTFROMWHEREGROUP BYHAVINGORDER BY(根据标准)。此外,MySQL 添加了LIMIT、 和 等内容INTO OUTFILESELECT您可以通过 MySQL在文档中描述该子句的方式看到这一点。您还可以在几乎所有数据库的文档中看到这一点。

诸如joinare 之类的操作是子句的一部分FROM(同样,WITH ROLLUPis 是 the 的一部分GROUP BY并且DESCis 是 的一部分ORDER BY)。这些可能看起来像是晦涩难懂的语法约定,但当存在像上面这样的限制时,它就变得很重要。

也许造成混乱的一个原因是缩进样式,如下所示:

select . . .
from t1
inner join t2
     on . . .
Run Code Online (Sandbox Code Playgroud)

join 语句在select. 这是误导性的。我会把它写成:

select 
from t1 join
     t2
     on . . .
Run Code Online (Sandbox Code Playgroud)

只有select条款排列在select.