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

crear un campo creciente (no id)

Estas en el tema de crear un campo creciente (no id) en el foro de Mysql en Foros del Web. Buenos dias!!!. Pues tengo que generar cuestionarios dinamicos en una tabla, y necesito agregar un campo para saber el numero de preguntas. Podria haberlo hecho ...
  #1 (permalink)  
Antiguo 15/05/2012, 07:09
 
Fecha de Ingreso: abril-2012
Mensajes: 65
Antigüedad: 12 años
Puntos: 0
crear un campo creciente (no id)

Buenos dias!!!.

Pues tengo que generar cuestionarios dinamicos en una tabla, y necesito agregar un campo para saber el numero de preguntas.

Podria haberlo hecho con un campo id incremental, pero o sirve debido a que si una persona entra y se genera el cuestionario por ejmplo 30 preguntas, luego entra otra y el id incremenetal partira del 31 y necesito que por cada cuestionario creado parta desde 1 hasta el numero total de preguntas que es dinamico de acuerdo a unos parametros.

este es el codigo con el cual estoy tratando de genrar en el campo norden que parte de 1 hasta que se genere el cuestionario (3 o 100 dependiendo)

Código:
(select if(((select max(formulario_paso.norden)  
from formulario_paso where formulario_paso.crr_idrelacion ='13153331' )>=0),

(select max(formulario_paso.norden)  + 1 

from formulario_paso 

where formulario_paso.crr_idrelacion ='13153331' ),

(select distinct 1 from formulario_paso where formulario_paso.crr_idrelacion ='13153331' ))),

este es el codigo completo

Código:
insert into formulario_paso
(select 
	'$usuario', 
	date_format(now(),'%Y-%m-%d %H-%i-%s'),
	'0000-00-00 00:00:00',
	'1200013726-8', 	
	'13153331', 
	preguntas.cod_idpregunta, 
	(select if(((select max(formulario_paso.norden)  from formulario_paso where formulario_paso.crr_idrelacion ='13153331' )>=0),
	(select max(formulario_paso.norden)  + 1 from formulario_paso where formulario_paso.crr_idrelacion ='13153331' ),(select distinct 1 from formulario_paso where formulario_paso.crr_idrelacion ='13153331' ))),
	0

from 
	preguntas, pregunta_estado
where 
	preguntas.cod_idpregunta in (select pregunta_delito.cod_pregunta from pregunta_delito where pregunta_delito.cod_delito in ((select if(
 ( '202' in ( 202,222,500,607,608,610,611,612,613,619,620,621,622,623,626,
		 627,628,629,630,631,632,633,634,635,637,701,702,801,802,803,
		 804,805,807,808,809,810,812,826,827,831,846,847,848,853,2001,
		 3001,4001,5001,7001,7006,7007,7014,7030,7031,7032,7033,7034,
		 7037,7042,7043,7099,8001,9001,12031,12040,12050,12075,12078,
		 12079,12080,12083,12133,12135,12152,12154,13028,14001,14002,
		 14003,14052,20004,20005,20006,20099)),('202'),(999999))))) and   
	preguntas.cod_idpregunta = pregunta_estado.cod_pregunta and
	pregunta_estado.valor_estados in (select valor_estado.valor_estado from valor_estado where valor_estado.gl_estado_res like '%t%'))

pero ese codigo (el primero no eh podido dar para que por cada nuevo registro agregue un "indice 1, 2 etc hacia abajo)

alguien?
  #2 (permalink)  
Antiguo 15/05/2012, 13:30
Avatar de fahs82  
Fecha de Ingreso: abril-2012
Ubicación: guadalajara
Mensajes: 139
Antigüedad: 12 años
Puntos: 12
Respuesta: crear un campo creciente (no id)

podrias hacerlo con un trigger de before insert pasando los parametros del insert y seteando los valores de tu incremental en base al id de tu usuario un ejemplo seria

set new.incremental =(select max(incremental) from tabla where usuario = new.usuario) + 1;

y condicional a un if incremental is null then set incremental = 1; bueno yo asi lo haria espero lo puedas adaptar a tus necesidades
  #3 (permalink)  
Antiguo 16/05/2012, 05:00
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: crear un campo creciente (no id)

Creo que se complican la vida....

El usuario debe estar usando un formulario para responder al cuestinario... luego en el momento de guardar la respuesta debes guardar el idUsuario, para saber quien esta contestando, el idCuestionario para saber que cuestionario esta respondiendo, y el idPregunta para saber que pregunta esta contestando.

Toda esa información la tienes que usar para presentar el formulario con la pregunta al usuario, luego usala para guardar la respuesta.

TblCuestionarios
idCuestionario
cuestionario
....

TblPreguntas
idPregunta (autoincremental)
idCuestionario FK
pregunta

TblUsuarios
idUsuario
usuario
....

TblRespuestas
idRespuesta
idCuestionario
idPregunta
idUsuario
respuesta

Código MySQL:
Ver original
  1. SELECT c.cuestionario, count(*) as preguntas
  2. FROM tblPreguntas p INNER JOIN tblCuestionarios c
  3.       ON p.idFormulario=c.idFormulario
  4. GROUP BY c.formulario

Te da el numero de preguntas por formulario.

Código MySQL:
Ver original
  1.        (@a:=@a+1) norden,
  2.        idPregunta,
  3.        pregunta
  4.     FROM tblPreguntas p JOIN (SELECT @a:= 0) t
  5.     WHERE p.idCuestionario=X
  6.     ORDER BY idPregunta

La lista de preguntas con su numerador sin saltos y empezando de 1, con esta query podras presentar el cuestionario con su numerador pero en el momento de guardar la respuesta guarda el idPregunta no el numero de orden....

Para confeccionar el cuestionario solo tienes que preocuparte de introducir las preguntas en el orden correcto

INSERT INTO tblPreguntas (idCuestionario,pregunta) VALUES (X,"La pregunta");

el auto incremental generara solo el identificador de la pregunta....y como es autoincremental siempre las podras listar por orden aun que tenga saltos....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #4 (permalink)  
Antiguo 16/05/2012, 07:17
 
Fecha de Ingreso: abril-2012
Mensajes: 65
Antigüedad: 12 años
Puntos: 0
Respuesta: crear un campo creciente (no id)

Cita:
Iniciado por quimfv Ver Mensaje
Creo que se complican la vida....

El usuario debe estar usando un formulario para responder al cuestinario... luego en el momento de guardar la respuesta debes guardar el idUsuario, para saber quien esta contestando, el idCuestionario para saber que cuestionario esta respondiendo, y el idPregunta para saber que pregunta esta contestando.

Toda esa información la tienes que usar para presentar el formulario con la pregunta al usuario, luego usala para guardar la respuesta.

TblCuestionarios
idCuestionario
cuestionario
....

TblPreguntas
idPregunta (autoincremental)
idCuestionario FK
pregunta

TblUsuarios
idUsuario
usuario
....

TblRespuestas
idRespuesta
idCuestionario
idPregunta
idUsuario
respuesta

Código MySQL:
Ver original
  1. SELECT c.cuestionario, count(*) as preguntas
  2. FROM tblPreguntas p INNER JOIN tblCuestionarios c
  3.       ON p.idFormulario=c.idFormulario
  4. GROUP BY c.formulario

Te da el numero de preguntas por formulario.

Código MySQL:
Ver original
  1.        (@a:=@a+1) norden,
  2.        idPregunta,
  3.        pregunta
  4.     FROM tblPreguntas p JOIN (SELECT @a:= 0) t
  5.     WHERE p.idCuestionario=X
  6.     ORDER BY idPregunta

La lista de preguntas con su numerador sin saltos y empezando de 1, con esta query podras presentar el cuestionario con su numerador pero en el momento de guardar la respuesta guarda el idPregunta no el numero de orden....

Para confeccionar el cuestionario solo tienes que preocuparte de introducir las preguntas en el orden correcto

INSERT INTO tblPreguntas (idCuestionario,pregunta) VALUES (X,"La pregunta");

el auto incremental generara solo el identificador de la pregunta....y como es autoincremental siempre las podras listar por orden aun que tenga saltos....
Gracias por todo, finalmente hice un procedimiento de almacenado y lo ejecute desde php y listo!

Saludos

pd: habia probado con (@a:=@a+1) y me solucionaba el tema, si ejecutaba la query desde mysql, pero al phpalizar el codigo no me funciono, pero ya esta arreglado. saludos!

Etiquetas: 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 18:20.