Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: yens en 12 de Junio de 2007, 05:30:07 PM

Título: Problema con MySQL
Publicado por: yens en 12 de Junio de 2007, 05:30:07 PM
Muy buenas gente! Pues eso que ando pasando codigo de consultas y demas historias de postgreSQL a MySQL y me he topado con que no me deja usar la clausula LIMIT en subconsultas...

He tirado de Google y comentan algunos que no soporta subconsultas, otros que no soportan las clausulas LIMIT, etc etc, y el propio MySQL me salta con que no se permiten en mi version (5.0.4) ni LIMIT ni IN/ALL/SOME en subconsultas.. He probado a quitarle el LIMIT 1 que tengo y si que tira.. pero claro yo necesito limitar en dos de las subconsultas a 1 lo que recoja.. se os ocurre alguna solucion? Con un MAX creo que no es lo oportuno.. Alguien ha topado con esto alguna vez o conoce solucion?

Gracias de antemano!
Título: Re: Problema con MySQL
Publicado por: Tei en 12 de Junio de 2007, 05:42:29 PM
la version 3.0 de mysql es una caca y no soporta muchas cosas que deberian ser esenciales.

y mas importante, yo para produccion no lo usaria.

a partir de la version 4, mysql es bantante gueno tanto en features como en solidez.

afecta un poco el tipo de almacenamiento (algunos tipos de almacenamiento no soportan transacciones, por ejemplo).

nota:
cuidado con las opiniones sobre base de datos, porque cada persona es un mundo, y segun con quien hables escucharas cosas radicalmente distintas, barriendo en todas las direcciones imaginables. Quizas hay mucho zealotismo en lo que respecta a bases de datos.
Título: Problema con MySQL
Publicado por: yens en 12 de Junio de 2007, 05:49:12 PM
Tei lo estoy haciendo porque no tengo en mi host POSTGRESQL... De hecho tengo toda una puta web que reescribir en metodos, creacion de bd etc por el tema este xD
Título: Problema con MySQL
Publicado por: Alexpi en 12 de Junio de 2007, 06:23:06 PM
siempre puedes como hago yo (por mi pesimo conocimiento de sql :P) y apoyarte en php para obtener lo que quieres =)
Título: Problema con MySQL
Publicado por: yens en 12 de Junio de 2007, 06:32:37 PM
Alexpi pero el problema radica en el tiempo de consulta, si no limito los resultados cuando hayan muuuchos (en un foro los hay) se me ira todo de vacaciones xD
Título: Problema con MySQL
Publicado por: RobiHm en 12 de Junio de 2007, 07:42:44 PM
¿dónde pones el limit? xD

pastea una consulta de las que te den error
Título: Problema con MySQL
Publicado por: Tei en 12 de Junio de 2007, 09:29:13 PM
se me ha raro que LIMIT no este soportado, de todos modos
quizas el formato es distinto

Esto por ejemplo limita a 40 resultados empezando por el resultado 0.

SELECT * FROM logsql ORDER BY FechaCreacion DESC, Idlogsql DESC LIMIT 40

Quizas estas intentando un formato de LIMIT estilo postgress.
Título: Problema con MySQL
Publicado por: jazcks en 12 de Junio de 2007, 10:23:03 PM
creo que a lo que yens se refiere es a una  consulta dentro de otra consulta, del estilo:

select * from ventas where idcliente in (select idcliente from clientes limit 0,1) limit 0,1

si dejo el primer "limit", no me funciona tampoco. (mysql 5.0.24)

opcion 1-has probado hacer un join? depende de que caso estes te puede funcionar, no se, algo asi:

select * from ventas inner join clientes on ventas.idcliente = clientes.idcliente limit 0, 1

opcion 2-prueba algo como:
select * from (select * from clientes limit 0,3) as clientes2 order by clientes2.idcliente
Título: Problema con MySQL
Publicado por: Kr0n en 13 de Junio de 2007, 12:21:34 AM
Pues como no pongas el select... esto reza el manual:

Citar
There are few restrictions on the type of statements in which subqueries can be used. A subquery can contain any of the keywords or clauses that an ordinary SELECT can contain: DISTINCT, GROUP BY, ORDER BY, LIMIT, joins, index hints, UNION constructs, comments, functions, and so on.
Título: Problema con MySQL
Publicado por: RobiHm en 13 de Junio de 2007, 12:22:53 AM
si quiere limitar a 1 simplemente tiene que comparar claves primarias... entonces no le veo sentido al limit, si no expone la subconsulta no le podremos dar ninguna solución concreta...
Título: Problema con MySQL
Publicado por: yens en 13 de Junio de 2007, 12:45:49 AM
Lo he arreglado metiendole un MAX del ID. Pero por lo que leo no soy el único que tiene esos problemas.

La consulta basicamente estaba formada por 3 tablas (2 subconsultas). Recogia el ultimo post, del ultimo tema, el usuario y fecha.
Título: Problema con MySQL
Publicado por: Kr0n en 13 de Junio de 2007, 09:05:43 AM
Como ya dije, el manual dice claramente que SI se puede. E incluso a partir de la versión 4.1. Por eso dije de ver el select.

Ojo, releyendo esto mucho me da por pensar que no estas usando el LIMIT dentro de la subquery sino ¿fuera? No se, repito que habría que ver la consulta. En cualquier caso, estas haciendo una subquery para coger un único resultado, así que parece intuitivo pensar que hay otra forma que no con el LIMIT no?

Pega la consulta, y saldremos de dudas :P
Título: Problema con MySQL
Publicado por: yens en 13 de Junio de 2007, 01:28:23 PM
Kr0n y a mí la ayuda me salta el mensaje de error que no se pueden usar en subquerys... la consulta es LA MISMA que tenía en postgresql, y funciona si o si:

SELECT creador,fecha_creacion FROM foros_posts as FP
WHERE tema_pertenece IN ( SELECT id_tema
  FROM foros_temas
  WHERE categoria IN ( SELECT id_categoria
   FROM foros_categorias
WHERE id_categoria = '" .$iCategoria. "')ORDER BY fecha_mod DESC LIMIT 1) ORDER BY fecha_creacion DESC LIMIT 1


Como véis, tengo una variable $iCategoria, ya que esto forma parte de una funcion en php sino usaria parametros, etc.
Título: Problema con MySQL
Publicado por: Kr0n en 13 de Junio de 2007, 01:50:39 PM
Ok, ya he visto el error que devuelve y creo que encontrado el motivo. Me estaba carcomiendo por dentro el tema del manual!

Según ésta página (http://dev.mysql.com/doc/refman/5.0/en/subquery-errors.html) de MySQL:
Citar
Unsupported subquery syntax:
ERROR 1235 (ER_NOT_SUPPORTED_YET)
SQLSTATE = 42000
Message = "This version of MySQL does not yet support
'LIMIT & IN/ALL/ANY/SOME subquery'"

This means that statements of the following form do not work yet:
SELECT * FROM t1 WHERE s1 IN (SELECT s2 FROM t2 ORDER BY s1 LIMIT 1)

Parece que la limitación esta en usar IN y LIMIT en una subquery. En mi server también me da ese error (5.0.28)

En tu caso, si estás limitando a 1 por qué usas IN? Usa "=". IN tendría sentido si devolvieras más de una fila. De hecho he probado la misma consulta pero con mis tablas, y funciona perfecto (creo).

Y otra cosa viendo tu query: para que necesitas el tercer SELECT? Si ya tienes el idCategoria no necesitas consultar a la base de datos otra vez para obtenerlo no?


SELECT creador,fecha_creacion
FROM foros_posts as FP
WHERE tema_pertenece = ( SELECT id_tema
                         FROM foros_temas
                         WHERE categoria = '" .$iCategoria. "'
                         ORDER BY fecha_mod DESC
                         LIMIT 1 )
ORDER BY fecha_creacion DESC
LIMIT 1
Título: Problema con MySQL
Publicado por: RobiHm en 13 de Junio de 2007, 03:33:23 PM
Cita de: "RobiHm"si quiere limitar a 1 simplemente tiene que comparar claves primarias... entonces no le veo sentido al limit, si no expone la subconsulta no le podremos dar ninguna solución concreta...

a eso me refería, si solo quieres un dato iguala por claves primarias y pilla los campos que te interesen sin más... el in se hace para agrupar/restar/ y todos esos temas...
Título: Problema con MySQL
Publicado por: yens en 13 de Junio de 2007, 03:53:32 PM
Bueno, muchisimas gracias a todos.. al final Kr0n tenia razon (y si alguno mas lo dijo.. pos tambien xD).

Muchas gracias a todos.. pero tranquilos que volvere con mas seguramnte! xDD