Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] Problema con los procedimientos.

Estas en el tema de Problema con los procedimientos. en el foro de Mysql en Foros del Web. Hola, estoy haciendo una web y a la hora de subirla a internet los procedimientos creados en la base de datos me dan el siguiente ...
  #1 (permalink)  
Antiguo 09/03/2014, 17:57
VityOsma
Invitado
 
Mensajes: n/a
Puntos:
Busqueda Problema con los procedimientos.

Hola, estoy haciendo una web y a la hora de subirla a internet los procedimientos creados en la base de datos me dan el siguiente fallo. En mi servidor local no me da ningún fallo utilizando la versión 3.5.1 de MySQL y en el servidor no permite crear los mismos scripts utilizando la versión 3.5.8.1. ¿A que se puede deber este fallo?

http://subefotos.com/ver/?96aa6b7e21f8aabc96b96e8e8d223e93o.jpg
  #2 (permalink)  
Antiguo 09/03/2014, 18:51
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problema con los procedimientos.

Dos cosas:
1) ¿Le pusiste el "DELIMITER // antes del CREATE PROCEDURE...? Pregunto porque no lo veo.
2) ¿MySQL 3.5.1? ¿Me puedes explicar cómo es que estás usando una versión tan perimida y obsoleta?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 10/03/2014, 13:01
VityOsma
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con los procedimientos.

No, no es por eso, el delimiter si que lo había puesto pero hice mal el pantallazo, lo hice cuando lo quite, el fallo que me daba con el delimiter es este, parece ser un problema de variables, ya que por lo que veo, no me reconoce "alea" como una variable. Este es el fallo.

http://s2.subirimagenes.com/otros/previo/thump_8841880imagen-001.jpg

Instale el WAMP 2.2 hace menos de un año, no se como tenia una versión tan antigua, ya me he descargado la nueva versión con el WAMP 2.4, Thanks you!
  #4 (permalink)  
Antiguo 10/03/2014, 13:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problema con los procedimientos.

Bueno, cuesta un poco leer el código con una mala captura de pantalla.
¿Podrías copiar y postear el código directamente aquí?
Para eso están los highlights (el combo arriba del area de edicion), que te permiten restaltar locrrectamente.
A mi me parece que el fallo puede estar en otra parte, pero como dije, cuesta leer eo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 12/03/2014, 08:44
VityOsma
Invitado
 
Mensajes: n/a
Puntos:
Busqueda Procedimiento con variable en limit.

Hola tengo un problema con mis procedimiento al subirlos a mi servidor MySQL.

En MySQL 5.X no se pueden utilizar variables dentro de la clausula LIMIT, y uno de mis procedimientos la necesita, así que necesito una solución para conseguir este resultado.
Código SQL:
Ver original
  1. delimiter //
  2. CREATE PROCEDURE reproductorGeneros (IN artista VARCHAR(50))
  3. BEGIN
  4. DECLARE cont INT;
  5. DECLARE alea INT;
  6. SET alea = rand() * 10;
  7. SELECT COUNT(*) INTO cont FROM canciones,artistas WHERE canciones.artista = artistas.nombre
  8.                                     AND artistas.url = artista
  9.                                 OR canciones.artista2 = artistas.nombre
  10.                                     AND artistas.url = artista
  11.                                 OR canciones.artista3 = artistas.nombre
  12.                                     AND artistas.url = artista
  13.                                 OR canciones.artista4 = artistas.nombre
  14.                                     AND artistas.url = artista;
  15. IF cont >= 10 THEN SET cont = 10; END IF;
  16. SET alea = rand() * (cont-1);
  17. SELECT canciones.nombre,idvideo,artista,artista2,artista3,artista4
  18.                             FROM canciones,artistas
  19.                                 WHERE canciones.artista = artistas.nombre
  20.                                     AND artistas.url = artista
  21.                                 OR canciones.artista2 = artistas.nombre
  22.                                     AND artistas.url = artista
  23.                                 OR canciones.artista3 = artistas.nombre
  24.                                     AND artistas.url = artista
  25.                                 OR canciones.artista4 = artistas.nombre
  26.                                     AND artistas.url = artista
  27.                                 GROUP BY idvideo ORDER BY canciones.rank DESC, canciones.nombre LIMIT alea,1;
  28. END
  29. //

Como podéis ver, lo que hago es buscar el numero de resultados de una consulta SQL y después busco un registro aleatorio dentro de los 10 primero, comprobando antes que hay más de 10 resultados, en caso contrario buscare uno entre el número de registros devueltos en al consulta inicial.

El problema es como ya os he dicho que no me permite utilizar variables en la clausula LIMIT al pasar la DB al servidor, ¿A alguien se le ocurre como puedo solucionarlo? Gracias!

Última edición por gnzsoloyo; 12/03/2014 a las 10:31
  #6 (permalink)  
Antiguo 12/03/2014, 10:31
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problema con los procedimientos.

No abras nuevos threads para tratar el mismo tema. Continúa a partir de donde lo dejaste, porque el tema aún no está resuelto.
El rpimero problema que tienes es que tienes un muy mal modelo de datos, porque tienes una tabla única para la relacion entre artistas y canciones, cuando esa relación debería ser una tabla relacional distinta. Esto es obligatorio para las relaciones N:M como esa.
El otro problema, la variable en el LIMIT dependerá de la versión de MySQL que haya en el host, por cuanto LIMIT no admite variables en las versiones de MySQL anteriores a la 5.1.x.

Por otro lado, obtener una lista de diez canciones ordenadas en forma aleatoria es tan simple como:
Código MySQL:
Ver original
  1. SELECT C.nombre, idvideo, CONCAT(artista, ', ', artista2, ', ', artista3, ', ', artista4) artistas
  2. FROM canciones C
  3. WHERE FIND_IN_SET(artista, CONCAT(artista, ', ', artista2, ', ', artista3, ', ', artista4)
  4. GROUP BY idvideo
  5. ORDER BY RAND(), C.rank DESC, C.nombre
Por supuesto que esto había que afinarlo, pero la idea más usada para este tipo de coasa es esta.

Repito que el modelo de la tabla que tienes es erróneo, y deberías considerar corregirlo antes de seguir adelante con un esquema profundamente defectuoso..
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 12/03/2014 a las 10:51
  #7 (permalink)  
Antiguo 12/03/2014, 11:11
VityOsma
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con los procedimientos.

La tabla la tengo así porque quiero que los artistas se mantengan en el orden en el que los he metido, el primero como artista el segundo como artista2 etc, si tuviera otra tabla de artistas con un registro para cada artista en cada canción perdería esta orden, así que me gusta así.

Tu código no me funciona, sabes como podría obtener 1 resultado aleatorio entre los 10 primero resultados, en este caso, serían las canciones con un RANC más alto, no se como hacerlo sin utilizar una variable en el LIMIT. El resultado que necesito es la consulta que me devuelva uno de los 10 primeros registros.
  #8 (permalink)  
Antiguo 12/03/2014, 11:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problema con los procedimientos.

Cita:
La tabla la tengo así porque quiero que los artistas se mantengan en el orden en el que los he metido, el primero como artista el segundo como artista2 etc, si tuviera otra tabla de artistas con un registro para cada artista en cada canción perdería esta orden, así que me gusta así.
Sigue siendo un error de diseño. No necesitas hacer una tabla con serios problemas de normalización para eso, sino usar el mismo principio de diseño del detalle de una factura, sólo que en lugar de ser los subitems de una compra, son cada uno de los artistas ingresados.
Además, al normalizar esa tabla te evitas restringir la cantidad de artistas a cinco, y también eliminas campos nulos o vacíos qu eno se encesitan. Adicionalmente se simplifica la query en mucho... realmente mucho.
Cita:
Tu código no me funciona,
Ese es el tipo de respuestas que no nos aporta la información necesaria...
¿No funciona porque genera un error de sintaxis, por errores de datos o porque el resultado no es exactamente el esperado?
Cita:
sabes como podría obtener 1 resultado aleatorio entre los 10 primero resultados, en este caso, serían las canciones con un RANC más alto, no se como hacerlo sin utilizar una variable en el LIMIT. El resultado que necesito es la consulta que me devuelva uno de los 10 primeros registros.
Es sencillo, si lo deduces de tus propias palabras:
Necesitas uno al azar, de los diez rankings más altos...
1) Ordenas por ranking, y tomas los diez primeros.
2) Reordenas al azar esos diez, y tomas el primero...

Algo como esto probablemente funcione para tu uso:
Código MySQL:
Ver original
  1. SELECT a, b, c, d
  2.     (SELECT a, b, c, d
  3.     FROM (SELECT a, b, c, d, ranking FROM tabla ORDER BY ranking DESC) T1
  4.     LIMIT 10) T2

Adaptalo a tus tablas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 12/03/2014, 12:02
VityOsma
Invitado
 
Mensajes: n/a
Puntos:
Busqueda Respuesta: Problema con los procedimientos.

Bueno, yo mis tablas las dejare así de momento ya que como máximo voy a pone 4 artistas, y tengo otras muchas cosas que hacer en PHP y Javascript, jQuery etc..así que puede que en el futuro tenga en cuenta tu consejo que ya se que esta mal, pero de momento no me disgusta así.

Ya, la verdad que podría haber puesto algo más, faltaba un paréntesis pero eso lo he solucionado nada más verlo, lo que pasaba era que me devolvía todo el rato el mismo resultado y como no lo entendía del todo no he podido solucionarlo, y por eso no he puesto más.

Este sí, eso es exactamente lo que necesitaba, ademas no tengo que utilizar variables porque con el limit 10 si hay mas de diez registros no da ningún fallo (como daría por ejemplo con limit 8,1 en una tabla de 6 registros). Además no sabia que se podía hacer eso y me va a venir muy bien saberlo en el futuro porque la verdad que es muy útil. Gracias por la ayuda, ahora si que he solucionado el problema, ademas que mis procedimiento me parecían un poco una chapuza y el nuevo resultado me gusta y me convence mucho más.

Gracias, me ha venido muy bien tu ayuda, te diría que si te hace falta mi ayuda ya sabes, pero veo que manejas bastante del tema por tu actividad en el foro así que no creo que pueda pero bueno, estas cosas luego la vida las devuelve jeje.

Un saludo.
  #10 (permalink)  
Antiguo 12/03/2014, 12:05
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problema con los procedimientos.



__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: procedimientos, procedimiento_almacenado
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:10.