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

Select dentro de insert

Estas en el tema de Select dentro de insert en el foro de Mysql en Foros del Web. Saludos amigos del foro, tengo un inconveniente con este insert: Código PHP: INSERT INTO tbl_pregunta_item_responde  ( Id_Pregunta ,  Id_Item_responde )  VALUES  ( LAST_INSERT_ID (), ( SELECT  ` tbl_item_responde ...
  #1 (permalink)  
Antiguo 26/06/2008, 11:22
 
Fecha de Ingreso: diciembre-2006
Ubicación: Tunja
Mensajes: 177
Antigüedad: 17 años, 3 meses
Puntos: 2
Select dentro de insert

Saludos amigos del foro, tengo un inconveniente con este insert:

Código PHP:
INSERT INTO tbl_pregunta_item_responde (Id_PreguntaId_Item_respondeVALUES (LAST_INSERT_ID(), (SELECT `tbl_item_responde`.Id_Item_responde FROM `tbl_item_respondeWHERE (`tbl_item_responde`.Cod_Tipo_Item 1))) 
El inconvenientes es que como la consulta retorna mas de una fila no lo puede ingresar. ¿Cómo puedo hacer para que me inserte todos los resultados de esa consulta?.

De antemano gracias.
__________________
Qubo Visual
www.mitunja.net
  #2 (permalink)  
Antiguo 27/06/2008, 07:54
 
Fecha de Ingreso: enero-2005
Mensajes: 105
Antigüedad: 19 años, 3 meses
Puntos: 2
Respuesta: Select dentro de insert

Creo que asi:


INSERT INTO tbl_pregunta_item_responde
SELECT LAST_INSERT_ID(), `tbl_item_responde`.Id_Item_responde
FROM `tbl_item_responde`
WHERE `tbl_item_responde`.Cod_Tipo_Item = 1
  #3 (permalink)  
Antiguo 27/06/2008, 13:42
 
Fecha de Ingreso: diciembre-2006
Ubicación: Tunja
Mensajes: 177
Antigüedad: 17 años, 3 meses
Puntos: 2
Respuesta: Select dentro de insert

Gracias si es asi, pero el problema esta es en el LAST_INSERT_ID(), pues solo se puede ingresar una vez y no varias, entonces esto afecta a la llave foranea de esta tabla, cuando intenta insertarlo al parecer el ultimo indice insertado se pierde y queda huérfana. te agradezco si tienes alguna solución a este inconveniente.

De antemano gracias.
__________________
Qubo Visual
www.mitunja.net
  #4 (permalink)  
Antiguo 27/06/2008, 13: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: Select dentro de insert

Tres preguntas:
1) ¿El campo Id_Pregunta, pertenece a la tabla tbl_pregunta_item_responde o a la tabla tbl_item_responde?
2) Si pertenece a la tabla tbl_pregunta_item_responde , ¿es autonumérico o no?
3) Si no es autonumérico, deberías controlar la numeración con un trigger. Si lo es, entonces la sentencia es sería simple:
Código:
INSERT INTO tbl_pregunta_item_responde
  (Id_Item_responde)
  SELECT `tbl_item_responde`.Id_Item_responde
  FROM `tbl_item_responde`
  WHERE `tbl_item_responde`.Cod_Tipo_Item = 1
__________________
¿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 27/06/2008, 14:12
 
Fecha de Ingreso: diciembre-2006
Ubicación: Tunja
Mensajes: 177
Antigüedad: 17 años, 3 meses
Puntos: 2
Respuesta: Select dentro de insert

El campo Id_pregunta es de otra tabla llamada tbl_pregunta, por eso es que necesito el LAST_INSERT_ID(), porque necesito ingresar el dato de la pregunta en tbl_pregunta y a su vez relacionarlo en tbl_pregunta_item_responde.
De antemano gracias.
__________________
Qubo Visual
www.mitunja.net
  #6 (permalink)  
Antiguo 27/06/2008, 18:04
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: Select dentro de insert

Antede de meternos en camisa de once varas (vieja expresión), hay que tener claro un pequeño problema:
- LAST_INSERT_ID(), devuelve el último valor de un campo autoincremental afectado por un INSERT. No mantiene su valor entre dos ejecuciones de sentencias, por más que las mismas sean secuenciales e inmediatas.
- Si se realizan un conjunto de inserciones en la misma operación (por ejemplo, en un INSERT INTO ... SELECT ... FROM ...), devuelve solamente el valor del primer registro insertado. El resto no se recupera. Esto implica que la operación debe hacerse registro a registro.
- Por su misma volatilidad, la información es fragil. El mejor uso de LAST_INSERT_ID() se encuentra en los store procedures.

¿Cómo te afecta?:
Si has hecho un insert a la tabla TBL_PREGUNTA, LAST_INSERT_ID() contiene X, pero al hacer el siguiente insert a TBL_PREGUNTA_ITEM, el valor se pierde. Pasa a valer cero.

En principio me parece que la solución estará implementando triggers, pero para darte alguna solución coherente tengo que perguntarte: ¿Cómo es la secuencia de ingreso de datos? Cómo se componen y relacionan la stablas?
__________________
¿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 28/06/2008, 07:22
 
Fecha de Ingreso: diciembre-2006
Ubicación: Tunja
Mensajes: 177
Antigüedad: 17 años, 3 meses
Puntos: 2
Respuesta: Select dentro de insert

En efecto ese es el problema porque cuando cambio el LAST_INSERT_ID() por un codigo de pregunta los inserta todos sin nigun inconveniente. Las tablas son tbl_pregunta, tbl_item_responde y tbl_pregunta_item_responde, esta ultima es un rompimiento entre las otras dos, es decir se ingresa la informacion en tbl_pregunta y se relaciona en tbl_pregunta_item_responde con la información del select anidado. te dejo una imagen para que lo comprendas mejor:



De antemano gracias.
__________________
Qubo Visual
www.mitunja.net
  #8 (permalink)  
Antiguo 30/06/2008, 19:17
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: Select dentro de insert

Mira, rynkydynky, por el gráfico que muestras, el problema no se puede resolver ni con una sentencia, ni con un trigger en una tabla, porque estás tomando y manipulando datos de al menos 5 tablas (las 3 del gráfico y otras 2 referidas por los FK).

El problema básico es la relación ternaria que representa la tabla TBL_PREGUNTA_ITEM_RESPONDE.

Esta debe llenarse con datos de dos fuentes: El ID de TBL_PREGUNTA y el ID de TBL_ITEM_RESPONDE cuando Cod_Tipo_Item es igual a X.

Este tipo de acción solamente se puede hacer con un Store Procedure. porque es la única forma en que vas a poder juntar esos dos datos en una sola vez.
Esto te permitiría ingresar los parámetros necesarios y resolver dentro del SP los pasos para que se haga correctamente.

Fuera de esta forma no veo una solución práctica, si he entendido bien el problema. No creo que lo puedas resolver con una simple consulta.

¿Has trabajado con SP?
__________________
¿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 01/07/2008, 07:50
 
Fecha de Ingreso: diciembre-2006
Ubicación: Tunja
Mensajes: 177
Antigüedad: 17 años, 3 meses
Puntos: 2
Respuesta: Select dentro de insert

Ok gracias, si he manejado store procedures en mysql, pero voy a modificar la base de datos para evitarme ese problema.

Muchas gracias.
__________________
Qubo Visual
www.mitunja.net
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:02.