error mysql sql view mysql-error-1349

mysql error 1349



MySQL: Ver con subconsulta en la limitación de la cláusula FROM (5)

No se pudo escribir la consulta en su comentario como sigue:

SELECT u1.name as UserName from Message m1, User u1 WHERE u1.uid = m1.UserFromID GROUP BY u1.name HAVING count(m1.UserFromId)>3

Eso también debería ayudar con los problemas de velocidad conocidos con subconsultas en MySQL

En MySQL 5.0, ¿por qué ocurre el siguiente error al intentar crear una vista con una subconsulta en la cláusula FROM?

ERROR 1349 (HY000): el SELECCIONAR de View contiene una subconsulta en la cláusula FROM

Si esto es una limitación del motor MySQL, ¿por qué no han implementado esta característica todavía?

Además, ¿cuáles son algunas buenas soluciones para esta limitación?

¿Existen soluciones provisionales que funcionen para cualquier subconsulta en la cláusula FROM o hay algunas consultas que no se pueden expresar sin utilizar una subconsulta en la cláusula FROM?

Una consulta de ejemplo (fue enterrada en un comentario):

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


Parece ser un problema conocido.

http://dev.mysql.com/doc/refman/5.1/en/unnamed-views.html

http://bugs.mysql.com/bug.php?id=16757

Muchas consultas IN se pueden volver a escribir como uniones (externas) y un IS (NOT) NULL de algún tipo. por ejemplo

SELECT * FROM FOO WHERE ID IN (SELECT ID FROM FOO2)

puede ser reescrito como

SELECT FOO.* FROM FOO JOIN FOO2 ON FOO.ID=FOO2.ID

o

SELECT * FROM FOO WHERE ID NOT IN (SELECT ID FROM FOO2)

puede ser

SELECT FOO.* FROM FOO LEFT OUTER JOIN FOO2 ON FOO.ID=FOO2.ID WHERE FOO.ID IS NULL



Yo tuve el mismo problema. Quería crear una vista para mostrar la información del año más reciente, de una tabla con registros de 2009 a 2011. Aquí está la consulta original:

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

Esquema de la solución:

  1. crear una vista para cada subconsulta
  2. reemplazar subconsultas con esas vistas

Aquí está la consulta de solución:

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;

Funciona bien en mysql 5.0.45, sin demasiada penalización de velocidad (en comparación con la ejecución de la selección de subconsulta original sin vistas).


crear una vista para cada subconsulta es el camino a seguir. Lo conseguí trabajando como un encanto.