Ver Mensaje Individual
  #8 (permalink)  
Antiguo 13/07/2012, 09:55
elpropiopato23
 
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