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

Pasar nombre de Campo o tabla a una Variable de Usuario en una consulta de mysql

Estas en el tema de Pasar nombre de Campo o tabla a una Variable de Usuario en una consulta de mysql en el foro de Mysql en Foros del Web. Tengan un cordial saludo: amigos de foros del web: Mi problema es el siguiente necesito hacer una consulta mas ¡NO UN STORED PROCEDURE!, necesito pasar ...
  #1 (permalink)  
Antiguo 11/07/2012, 09:03
 
Fecha de Ingreso: octubre-2011
Ubicación: Niquitao
Mensajes: 28
Antigüedad: 12 años, 6 meses
Puntos: 0
Pasar nombre de Campo o tabla a una Variable de Usuario en una consulta de mysql

Tengan un cordial saludo: amigos de foros del web:
Mi problema es el siguiente necesito hacer una consulta mas ¡NO UN STORED PROCEDURE!, necesito pasar el nombre de un campo a una variable y la consulta busque basandose en la variable Ejemplo:
Nombre de la tabla: grade
Campos: idgrade, name, description
Una Consulta normal seria esta:
SELECT * FROM grade WHERE idgrade=1 y sabemos que esta consulta me retornara los valores deseados
Con una variable funcionaria si hago esto:
SET @valor=1;
SELECT * FROM grade WHERE idgrade=@valor
esta consulta tambien funciona porque reconoce el valor que se le esta asigando a la variable que en esta caso es 1.

Pero lo que yo necesito es hacer lo siguiente:
SET @campo=idgrade;
SELECT * FROM grade WHERE @campo=1
Esta Consulta no funciona, me muestra 0 Resultados.

Si encontramos la solución al problema anterior, podre hacer la consulta que yo deseo que es la siguiente:
SET @campo=idgrade, @tabla=grade ;
SELECT * FROM @tabla WHERE @campo=1


Como les digo el Objetivo es que sea consulta, pero si tambien encuentran la solución por STORED PROCEDURE tambien aceptare la sugerencia

Cualquier Ayuda es Bienvenida Muchas Gracias.

Última edición por elpropiopato23; 11/07/2012 a las 09:23
  #2 (permalink)  
Antiguo 11/07/2012, 09:47
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Pasar nombre de Campo o tabla a una Variable de Usuario en una consulta de

Hola elpropiopato23:

Creo que estás hablando de Sentencias Preparadas... dale un vistazo a esta liga:

http://dev.mysql.com/doc/refman/5.0/es/sqlps.html

Cita:
¡NO UN STORED PROCEDURE!
¿Y alguna razón en particular por la que no quieres utilizar SP?

Si estás utilizando algún lenguaje de programación, podría crear el SELECT como quieras y finalmente ejecutar la sentencia, pero ese no sería un tema de MySQL, sino del lenguaje de programación que estés utilizando.

Saludos
Leo.
  #3 (permalink)  
Antiguo 12/07/2012, 11:07
 
Fecha de Ingreso: octubre-2011
Ubicación: Niquitao
Mensajes: 28
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: Pasar nombre de Campo o tabla a una Variable de Usuario en una consulta de

Hola leonardo_josue:
De Antemano te doy muchas Gracias Por responderme tan pronto, y discúlpame por la demora en responder de mi parte, lo que pasa es lo siguiente tengo una tabla llamada
stream cuyos campos son los siguientes idstream, tabla, claveprimaria
El campo tabla tiene los nombres de las tablas de mi base de datos , y el campo claveprimaria tiene la clave primaria de esa tabla entonces te explicare esto:
Hay 3 tablas stream, grade, asignatura:
Tabla=grade y tiene los campos idgrade,name,description
Tabla= asignatura y tiene los campos idasignatura, name, description,

Echemos un vistaso a los datos de la tabla grade

idgrade ----- name ------- description
1 ---------- primero --------- Primergrado
2 ---------- segundo ------- Segundogrado


Echemos un vistaso a los datos de la tabla asignatura

idasignatura----- name ----------- description
10 ---------- Lengua Castellana ------- Español
20 ------------ Matemáticas --------- Matemáticas

Echemos un vistaso a los datos de la tabla stream

idstream ----- tabla ---------- claveprimaria
10 ---------- asignatura ---------- 10
20 ------------ grade ------------ 2


Una consulta normal seria la siguiente
SELECT grade.* FROM stream INNER JOIN grade ON stream. claveprimaria = grade.idgrade WHERE stream. claveprimaria =2 AND stream. tabla =’grade’

Me arrojaria el siguiente resultado:


idgrade ----- name ------- description
2 ---------- segundo ------ Segundogrado

Los resultados son correctos porque yo especifico el nombre de la tabla.
Como se observa a continuación INNER JOIN grade
y su clave primaria ON stream. claveprimaria = grade.idgrade estos valores son con los que nos hace la relación de las 2 tablas.

Pero la consulta se debe hacer de la siguiente forma la tabla con la que se relacionara en el INNER JOIN debe ser un valor que varía, en este caso puede ser asignatura o grade Ejemplo:

SELECT grade.* FROM stream INNER JOIN (valor del campo tabla) ON stream.claveprimaria= (valor del campo tabla).id(valor del campo tabla) WHERE stream.idregistry=2 AND stream. tabla =(valor del campo tabla)

Por este motivo pense en una variable debido a que el valor se le especifica desde afuera
SET @tabla=grade, @campo = CONCAT(´id´, @tabla) ; “@campo su valor sera idgrade”
SELECT @tabla.* FROM stream INNER JOIN @tabla ON stream. claveprimaria = @tabla . @campo WHERE stream. claveprimaria =2 and stream.tabla = @tabla
No se si abra mejores metodos de hacer esta consulta, lo unico que pido es que apartir de los datos de los campos (tabla,claveprimaria) la tabla stream haga los INNER JOIN basándose en el valor de los datos de estos 2 campos

Última edición por elpropiopato23; 12/07/2012 a las 12:15 Razón: Mal Organizado el Mensaje
  #4 (permalink)  
Antiguo 12/07/2012, 12:19
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Pasar nombre de Campo o tabla a una Variable de Usuario en una consulta de

Hola de nuevo elpropiopato23:

Creo que te estás complicando la existencia de más... estás tratando de "ahorrar" código, cuando podrías simplemente tener dos consultas y ejecutar una u otra según sea el caso. Además, estamos hablando de consultas muy simples, y por lo tanto que no deberían implicar mucho trabajo, entonces me pregunto por qué la insistencia en hacer la consulta como lo pretendes... Hay muchas maneras de matar una mosca, pero utilizar una pistola puede resultar excesivo.

Si insistes en hacer la consulta, la única manera sería con Sentencias Preparadas, tal como te mencioné en el post, donde tu formes la consulta a tu antojo, espero que hayas revisado la liga que te puse.

Saludos
Leo.
  #5 (permalink)  
Antiguo 12/07/2012, 12:21
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: Pasar nombre de Campo o tabla a una Variable de Usuario en una consulta de

Cita:
Por este motivo pense en una variable debido a que el valor se le especifica desde afuera
Perfectamente comprendido. Pero parece que lo que no te resulta claro es que MyQL no permite que se usen variables para indicar tablas, campos u otras cosas, y crear dinámicamente sentencias. A diferencia de SQL Server y Oracle, por nombrar dos de ellos, no toma una cadena de texto que contiene una sentencia y la ejecuta como tal. Se necesitan otro tipo de objetos.

MySQL cuenta para eso con un recurso que se denomina "sentencias preparadas", y es la única forma de manejar dinámicamente la creación de una consulta, basada en parámetros, como lo planteas. Por eso Leonardo te posteó ese link: Para que lo veas y analices.

Un tema a revisar es que donde las sentencias preparadas se manejan con mayor facilidad es con un stored procedures, por lo que cabe la pregunta: ¿Por qué no un SP? Eso es algo que no has contestado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 12/07/2012, 12:53
 
Fecha de Ingreso: octubre-2011
Ubicación: Niquitao
Mensajes: 28
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: Pasar nombre de Campo o tabla a una Variable de Usuario en una consulta de

Bueno leonardo_josue y gnzsoloyo, estoy muy agrdecido por sus respuestas, y si voy a usar un Stored Procedure, el objetivo de lo que planeaba era poder ejecutar todo desde una consulta, ya estoy empezando a trabajar desde ahora:En el Stored Procedure pero mirare primero las sentencias preparadas de hay escogere cual de las 2 formas de hacer lo que quiero voy a implemntar.
Cualquier otra pregunta la estare informando.
Muchas Gracias a ambos por la colaboración prestada.

Última edición por elpropiopato23; 12/07/2012 a las 12:58
  #7 (permalink)  
Antiguo 12/07/2012, 13: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: Pasar nombre de Campo o tabla a una Variable de Usuario en una consulta de

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 13/07/2012, 09:55
 
Fecha de Ingreso: octubre-2011
Ubicación: Niquitao
Mensajes: 28
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: Pasar nombre de Campo o tabla a una Variable de Usuario en una consulta de

Nuevamente los saludo a ustedes 2: gnzsoloyo y leonardo_josue.
Han sido una fuente de ayuda para la consulta que estoy haciendo.
Hasta el momento he integrado las 2 funciones, que ustedes dos me han recomendado, usando Stored Preocedure y Sentencias Preparadas.

Yo observé la ayuda que le presto gnzsoloyo a diego1311 el 07/12/2010 en el tema Tabla como parámetro en stored procedure.
Esté es el link de ese tema http://www.forosdelweb.com/f21/tabla-como-parametro-stored-procedure-866424/
Y basandome en ese ejemplo de verdad que me dio lo que estaba necesitando hasta el momento.

Pero les pido el favor que se devuelvan al 2 mensaje que yo publiqué en el cual les mostré las 3 tablas implicadas con sus registros.

Hice este código y me dio los resultados esperados:
DELIMITER $$

DROP PROCEDURE IF EXISTS `leer` $$
CREATE DEFINER=`database` PROCEDURE ` readdata `(IN tabla VARCHAR(100), IN idcampo VARCHAR(50), IN valor INT)
BEGIN
SET @snt = CONCAT('SELECT ' ,tabla,'.* FROM stream INNER JOIN ',tabla ,' ON stream.claveprimaria = ',tabla,'.',idcampo,
' WHERE stream.claveprimaria = ', valor,' AND tabla = ',tabla
);
PREPARE sent FROM @snt;
EXECUTE sent;
DEALLOCATE PREPARE sent;
END $$

DELIMITER ;


Ahora observemos lo siguiente, una consulta normal seria esta :
SELECT grade.* FROM stream INNER JOIN grade ON stream.claveprimaria = grade.idgrade
WHERE stream.idstream = 20


Y me devolveria este resultado:

idgrade ----- name ------- description
2 ---------- segundo ------ Segundogrado

Si observaron en los datos de la tabla stream, la clave primaria de esta tabla ‘idstream’ tiene los siguientes datos 10 y 20, yo necesito pasarle el 20 a una variable obviamente con esta consulta (select idstream order by campo DESC LIMIT 1)

Solo que no tengo muy claro como pasar una consulta a una variable.

Para que basándome en el valor que me arroje esa consulta, pueda consultar en el WHERE de la consulta con ese valor.
Como se puede Observar a continuación, lo Traduje a Stored Procedure intentandolo hacer de esta manera:

DELIMITER $$

DROP PROCEDURE IF EXISTS `leer` $$
CREATE DEFINER=`database` PROCEDURE `readdata`(IN tabla VARCHAR(100), IN idcampo VARCHAR(50))
BEGIN
DECLARE lastregistry INT;
SET lastregistry = (SELECT idstream FROM stream order by idstream DESC LIMIT 1);

SET @snt = CONCAT('SELECT ' ,tabla,'.* FROM stream INNER JOIN ',tabla ,' ON stream.claveprimaria = ',tabla,'.',idcampo,
' WHERE stream.idstream = ', lastregistry);
PREPARE sent FROM @snt;
EXECUTE sent;
DEALLOCATE PREPARE sent;
END $$

DELIMITER ;

Al llamar el Stored Procedure:
call readdata('grade','idgrade') .
Me sale este error: Operand should contain 1 column(s)

Creo que donde esta el problema es aquí:
DECLARE lastregistry INT;
SET lastregistry = (SELECT idstream FROM stream order by idstream DESC LIMIT 1);
,
sino es hay el problema yo se que ustedes me sabran corregir y me mostraran como hacerlo.

Ah por cierto es muy probable que ustedes me digan que lo haga de esta manera:
SELECT grade.* FROM stream INNER JOIN grade ON stream.claveprimaria = grade.idgrade
WHERE stream.idstream IN (SELECT idstream FROM stream order by idstream DESC LIMIT 1)

y yo se que me va a dar el resultado esperado,
pero yo quiero aprender como fijarle una consulta a una variable pues me va ayudar en otras cosas que planeo hacer.

Por lo tanto les pido su cordial ayuda en este punto.
Muchas Gracias y espero su pronta respuesta.

Última edición por elpropiopato23; 13/07/2012 a las 10:59
  #9 (permalink)  
Antiguo 13/07/2012, 11:10
 
Fecha de Ingreso: octubre-2011
Ubicación: Niquitao
Mensajes: 28
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: Pasar nombre de Campo o tabla a una Variable de Usuario en una consulta de

Que pena nuevamente a los 2, yo estaba ejecutando mal el stored Procedure,
Pero si estaba Correcto, solo que no me fije y yo estaba ejecutando mal la sentencia dentro del subquery
SELECT grade.* FROM stream INNER JOIN grade ON stream.claveprimaria = grade.idgrade
WHERE stream.idstream IN (SELECT * FROM stream order by idstream DESC LIMIT 1)

Como el asterisco afecta la consulta por eso me estaba saliendo este error: Operand should contain 1 column(s)

Cuando tiene que ser así:
SELECT grade.* FROM stream INNER JOIN grade ON stream.claveprimaria = grade.idgrade
WHERE stream.idstream IN (SELECT idstream FROM stream order by idstream DESC LIMIT 1)


Por lo tanto aqui les dejo los 2 ejemplos de como hice este Stored Procedure:

Sin Subquery pero asignandole la consulta a una variable:
DELIMITER $$

DROP PROCEDURE IF EXISTS `leer` $$
CREATE DEFINER=`database` PROCEDURE `readdata`(IN tabla VARCHAR(100), IN idcampo VARCHAR(50))
BEGIN
DECLARE lastregistry INT;
SET lastregistry = (SELECT idstream FROM stream order by idstream DESC LIMIT 1);
SET @snt = CONCAT('SELECT ' ,tabla,'.* FROM stream INNER JOIN ',tabla ,' ON stream.claveprimaria = ',tabla,'.',idcampo,
' WHERE stream.idstream = ', lastregistry);
PREPARE sent FROM @snt;
EXECUTE sent;
DEALLOCATE PREPARE sent;
END $$

DELIMITER ;

Con Subquery pero sin asignarle la consulta a una variable

DELIMITER $$

DROP PROCEDURE IF EXISTS `lastoperation` $$
CREATE DEFINER=`database` PROCEDURE `readdata`(IN tabla VARCHAR(100), IN idcampo VARCHAR(50))
BEGIN
SET @snt = CONCAT('SELECT ' ,tabla,'.* FROM stream INNER JOIN ',tabla ,' ON stream.claveprimaria = ',tabla,'.',idcampo,
' WHERE stream.idstream = ( SELECT idstream FROM stream order by idstream DESC LIMIT 1)');
PREPARE sent FROM @snt;
EXECUTE sent;
DEALLOCATE PREPARE sent;
END $$

DELIMITER ;

Estoy muy agradecido por sus ayudas.

Última edición por elpropiopato23; 13/07/2012 a las 11:48

Etiquetas: nombre, select, tabla, campos
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 02:30.