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

[SOLUCIONADO] Se puede hacer esto en una sql?

Estas en el tema de Se puede hacer esto en una sql? en el foro de Mysql en Foros del Web. Hola gente, tengo un problema, tengo que hacer una query pero que esté solo en una sql, y basicamente quiero que se guarde en una ...
  #1 (permalink)  
Antiguo 13/06/2015, 03:54
 
Fecha de Ingreso: septiembre-2012
Mensajes: 10
Antigüedad: 11 años, 7 meses
Puntos: 0
Se puede hacer esto en una sql?

Hola gente, tengo un problema, tengo que hacer una query pero que esté solo en una sql, y basicamente quiero que se guarde en una varible el contenido de una consulta sql, he probado con el declare y el set y luego una sql y no aparece nada, me da error en el mysql. Se puede hacer algo parecido en la sql entera que me funciona bien algo como

SELECT hola = (SELECT .....) y luego seguir con mi consulta anterior que me funciona bien??.

En 2 sql lo hago fácil pero en 1 sola no porque no me salen todos los registros correctos, tengo que hacerlo en una sola sql porque lo hago con hilos asincronos y ya sabeis los problemas que da esto.

Gracias de antemano, 1 saludo.
  #2 (permalink)  
Antiguo 13/06/2015, 05:22
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: Se puede hacer esto en una sql?

La descripción es un poco pobre, pero en esencia se puede hacer que el resultado de una query se almacene en una variable de MySQL, pero la sintaxis está mal.
Es un ejemplo de manual lo que necesitas.
Te conviene leer el manual de referencia. ¿O ni siquiera lo hiciste nunca?
__________________
¿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 13/06/2015, 07:49
 
Fecha de Ingreso: septiembre-2012
Mensajes: 10
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Se puede hacer esto en una sql?

Cita:
Iniciado por gnzsoloyo Ver Mensaje
La descripción es un poco pobre, pero en esencia se puede hacer que el resultado de una query se almacene en una variable de MySQL, pero la sintaxis está mal.
Es un ejemplo de manual lo que necesitas.
Te conviene leer el manual de referencia. ¿O ni siquiera lo hiciste nunca?
he probado con el declare y el set y luego una sql y no aparece nada, me da error en el mysql.
Eso es lo que he puesto, lo he hecho, ¿o ni siquiera me has leido?
  #4 (permalink)  
Antiguo 13/06/2015, 08:13
Avatar de TIExpert  
Fecha de Ingreso: mayo-2015
Ubicación: Venezuela
Mensajes: 167
Antigüedad: 8 años, 11 meses
Puntos: 17
Respuesta: Se puede hacer esto en una sql?

Hola amigo, ¡si se puede! (Parece eslogan político)

En MySQL se hace así:

...
...
...
declare var char(25); (Char de 25 porque se me ocurrió)
...
...
...
set var = (select campo1 from tabla where condicion1 ....);
...
...
...

Obviamente puedes usar el tipo de variable que quieras char, float, etc. Pero tipo del campo en la base de datos debes hacerlo coincidir con el tipo de la variable que declaras.

Espero hacerte ayudado.
__________________
Mas de 20 años de experiencia en soporte de plataforma TI para empresas.
  #5 (permalink)  
Antiguo 13/06/2015, 09:40
 
Fecha de Ingreso: septiembre-2012
Mensajes: 10
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Se puede hacer esto en una sql?

Cita:
Iniciado por TIExpert Ver Mensaje
Hola amigo, ¡si se puede! (Parece eslogan político)

En MySQL se hace así:

...
...
...
declare var char(25); (Char de 25 porque se me ocurrió)
...
...
...
set var = (select campo1 from tabla where condicion1 ....);
...
...
...

Obviamente puedes usar el tipo de variable que quieras char, float, etc. Pero tipo del campo en la base de datos debes hacerlo coincidir con el tipo de la variable que declaras.

Espero hacerte ayudado.
Me sigue dando error, esta es parte de mi sql

declare var sinleer as integer(25);
set var =1;

select distinct xxxxx, sinleer
from xxx
where xxxx
(he puesto = 1 por poner algo)
He probado sin tamaño, con int e incluso lo mismo que me has puesto y me sale un error en mysql "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'declare var sinleer as char(25)' at line 1 "

:S

Última edición por sdelcueto; 13/06/2015 a las 09:41 Razón: Completar post
  #6 (permalink)  
Antiguo 13/06/2015, 10:00
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: Se puede hacer esto en una sql?

¿Les queda claro que toda esa sintaxis sólo funciona dentro de un stored procedure?
Por fuera de él, nada de eso funciona.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 13/06/2015, 10:15
 
Fecha de Ingreso: septiembre-2012
Mensajes: 10
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Se puede hacer esto en una sql?

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿Les queda claro que toda esa sintaxis sólo funciona dentro de un stored procedure?
Por fuera de él, nada de eso funciona.
No creo que pueda usar un store procedure con la tecnologia que estoy mirando, x eso necesito alguna otra forma :S
  #8 (permalink)  
Antiguo 13/06/2015, 19:37
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: Se puede hacer esto en una sql?

Bueno, ahora que tengo tiempo, y estoy frente a mi notebook, puedo contestarte un poco más claramente. Antes he posteado mensajes cortos porque estaba tratando de guiarte desde mi celular, y no siempre se escribe lo suficientemente rápido.

Como sea, empecemos por una aclaración:
Cita:
he probado con el declare y el set y luego una sql y no aparece nada, me da error en el mysql.
Eso es lo que he puesto, lo he hecho, ¿o ni siquiera me has leido?
Si, te leí perfectamnete, y lo entendi bien claro. Y mi respuesta sigue siendo la misma en muchos sentidos: Necesitas leer el manual de referencia para entender como funciona MySQL, y en qué se diferencia de otros DBMS. Si te lo dije, y considerando el problema que planteas, creo que como mínimo deberías haber hecho eso...
Es lo que hacemos todos, antes de ir a pregutnar cosas base, como la de variables...

Como sea, la cosa es así: MySQL maneja dos tipos de variables y en dos entornos diferentes. Por un lado las variables locales de stored procedures, que se deben declarar con DECLARE, y sólo existen en el momento de ejecución del SP, y únicamente dentro del cuerpo del SP.
Por otro lado existen variables de usuario, que no se deben declarar, sino sólo inicializar, y que existen en una conexión de MySQL, permaneciendo hasta tanto se cierre o caiga la conexión a MySQL, por la razón que sea.
Las primeras son locales de los SP deben tener nombres que comienzan con letras, y no pueden llevar signos en su nombre; deben declararse por tipo de dato reconocido por MySQL, y sólo operan con datos del mismo tipo.
Las variables de usuario deben comenzar su nombre con "@" en todos los casos, y siempre que se las invoca se debe poner el nombre de la misma forma.

Ahora bien, como dije, una variable declarada con DECLARE no puede usarse fuera de una rutina almacenada, como tampoco el DECLARE funciona fuera de ella.
Código MySQL:
Ver original
  1. DELIMTER $$
  2. CREATE PROCEDURE procedimiento(IN nombre VARCHAR(200))
  3.   DECLARE id INT;
  4.   SET id = 0;
  5.   SELECT idTabla
  6.   FROM tabla
  7.   WHERE nombre = nombre
  8.   LIMIT 1
  9.   INTO id;
  10.  
  11.   SELECT id;
  12. END$$
  13.  
  14. DELIMITER ;
Este sería un ejemplo de un SP creado por consola de MySQL, que puede recibir un parámetro de tipo VARCHAR para buscar un único registro y devolver su ID.
Alli se puede apreciar como se declara una variable, se la inicializa y se la carga con lo obtenido en el SP, para terminar exponiendo como salida el resultado de la búsqueda. Es un SP bastante inutil, pero para el ejemplo sirve.

Ahora bien, las variables de usuario pueden usarse dentro de la conexión en modo consola, o ejecutarse de cualquier forma y conservan su valor, en tanto la conexión donde se crean no se cierre.
Pero como no tienen tipo de ato, adoptarán el que tenga cuando se las inicializa, cosa que hay que hacer obligatoriamente, porque de lo contrario su valor es NULL, y eso destruye cualquier operación que se haga con ellas (sumar, multiplicar, concatenar, restar, dividir, o combinar cualquier da,to con un NULL da NULL).
Código MySQL:
Ver original
  1. SET @id = 0;
  2.   SELECT idTabla
  3.   FROM tabla
  4.   WHERE nombre = 'nombre bsucado'
  5.   LIMIT 1
  6.   INTO @id;
  7.   SELECT @id;
Otro detalle a tener en cuenta es que una variable de usuario adopta el valor en el mismo paso donde esta asignación ocurre, y si en la misma sentencia su valor cambia más de una vez, el valor resultante real es el final.
Código MySQL:
Ver original
  1. mysql> SELECT (@id:=1) a, @id,
  2.     ->     (@id:=@id+1) b,  @id,
  3.     ->     (@id:=@id+1) c,  @id,
  4.     ->     (@id:=@id-1) e,  @id,
  5.     ->     (@id:=@id * 110) f, @id;
  6. +---+------+------+------+------+------+------+------+------+------+
  7. | a | @id  | b    | @id  | c    | @id  | e    | @id  | f    | @id  |
  8. +---+------+------+------+------+------+------+------+------+------+
  9. | 1 |    1 |    2 |    2 |    3 |    3 |    2 |    2 |  220 |  220 |
  10. +---+------+------+------+------+------+------+------+------+------+
  11. 1 row in set (0.00 sec)
  12. mysql> SELECT @id;
  13. +------+
  14. | @id  |
  15. +------+
  16. |  220 |
  17. +------+
  18. 1 row in set (0.00 sec)
Como puedes ver en el ejemplo, la asignación dinámica (en MySQL se hace con ":=" en la misma sentencia), genera una sucesion de valores diferentes para la variable, cada uno en su propio punto de la misma SELECT.

Por este tipo de cosas es difícil dominar las variables de usuario en MYSQL sin bastante práctica.

¿Se va entendiendo?

Una nota final: Una variable de usuario puede crearse en un SP y ser visible fuera de él, en tanto la conexión no se cierre. Poer hay que recordar que una segunda ejecución del mismo SP "verá" la variable como estaba luego de la anterior ejecución, es decir CON valor.
Como los valores de las variables de usuario no se pierden sino al cerrarse la conexión, entonces deben siempre ser reinciializadas antes de ser usadas, para anular sus valores.

¿Va quedando más claro ahora?

Cita:
No creo que pueda usar un store procedure con la tecnologia que estoy mirando,
Eso que dices no tiene sentido: TODO lenguaje de programación puede invocar stored procedures a una base de datos. TODOS.
Que no sepas como hacerlo en le lenguaje que elegiste, no es lo mismo que decir no se puede. En todo caso deberás acudir al manual de referncia de ese lenguaje par ver cómo se hace...

O sea: Lee los manuales.
__________________
¿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 14/06/2015, 05:28
 
Fecha de Ingreso: septiembre-2012
Mensajes: 10
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Se puede hacer esto en una sql?

Ya está solucionado, muchisimas gracias a todos, os he dado el "me gustó" ^^
  #10 (permalink)  
Antiguo 14/06/2015, 06:56
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: Se puede hacer esto en una sql?

Si ya lo solucionaste, lo correcto en FDW es que compartas la solución.
Nadie responde las preguntas buscando puntos, sino tratando de colaborar y que el resto también vea las soluciones que se obtienen.
__________________
¿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: registro, select, sql
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 06:14.