MySQL ERROR 1349 What I am missing?

懵懂的女人 提交于 2019-12-30 11:38:11

问题


I am getting a MySQL 1349 error, but it appears as though the error is incorrect:

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

Can I not have ANY subqueries when creating a view?

Here is my 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
)

Thank you for your time.


回答1:


You are missing the fact that views in MySQL do not allow subqueries in the from clause. They are allowed in the select and where and having clauses, however.

The documentation is quite clear:

Subqueries cannot be used in the FROM clause of a view.

In your case, you can probably rewrite the from clause as a correlated subquery in the select clause. You can also use multiple layers of views to do what you want.

EDIT:

A SELECT statement in SQL has the following clauses: SELECT, FROM, WHERE, GROUP BY, HAVING, and ORDER BY (according to the standard). In addition, MySQL adds things like LIMIT, and INTO OUTFILE. You can see this in the way that MySQL describes the SELECT clause in the documentation. You can also see this in the documentation for almost any database.

Operations such as join are part of the FROM clause (similarly WITH ROLLUP is part of the GROUP BY and DESC is part of the ORDER BY). These may seem like arcane syntactic conventions, but it becomes important when there is a restriction like the one above.

Perhaps one reason for the confusion is an indentation style that goes like:

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

Where the join statements line up under the select. This is misleading. I would write this as:

select 
from t1 join
     t2
     on . . .

Only the select clauses line up under the select.




回答2:


The above answers are correct. MySQL 5.5 does not allow subqueries in the FROM clause. It is allowed now, however, in MySQL 5.7.7 and later.




回答3:


Refer to the documentation --

A view definition is subject to the following restrictions:

The SELECT statement cannot contain a subquery in the FROM clause.

Create a separate view for each of the FROM clause.



来源:https://stackoverflow.com/questions/17983379/mysql-error-1349-what-i-am-missing

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!