Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema con MySQL

Iniciado por yens, 12 de Junio de 2007, 05:30:07 PM

« anterior - próximo »

yens

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!

Tei

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.

yens

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

Alexpi

siempre puedes como hago yo (por mi pesimo conocimiento de sql :P) y apoyarte en php para obtener lo que quieres =)
Juego web www.goldpiece.net

yens

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

RobiHm

¿dónde pones el limit? xD

pastea una consulta de las que te den error
Web : Indómita
Blog : MiBlog
Evobas : Evobas
Kobox : Kobox

Tei

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.

jazcks

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

Kr0n

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.
- Por un stratos menos tenso -

Orgulloso limpiador de www.fregocles.com
visualizeus - favoritos sociales para imágenes

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...
Web : Indómita
Blog : MiBlog
Evobas : Evobas
Kobox : Kobox

yens

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.

Kr0n

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
- Por un stratos menos tenso -

Orgulloso limpiador de www.fregocles.com
visualizeus - favoritos sociales para imágenes

yens

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.

Kr0n

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 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
- Por un stratos menos tenso -

Orgulloso limpiador de www.fregocles.com
visualizeus - favoritos sociales para imágenes

RobiHm

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...
Web : Indómita
Blog : MiBlog
Evobas : Evobas
Kobox : Kobox






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.