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

Consulta mysql controlando un campo y generando otro

Estas en el tema de Consulta mysql controlando un campo y generando otro en el foro de Mysql en Foros del Web. Hola , tengo una consulta mysql y queria reformarla , tiene 4 preguntas y una respuesta correcta pero indica el nro de respuesta y no ...
  #1 (permalink)  
Antiguo 18/02/2013, 11:31
 
Fecha de Ingreso: diciembre-2011
Ubicación: pontevedra
Mensajes: 17
Antigüedad: 12 años, 4 meses
Puntos: 0
Consulta mysql controlando un campo y generando otro

Hola , tengo una consulta mysql y queria reformarla , tiene 4 preguntas y una respuesta correcta pero indica el nro de respuesta y no la respuesta en si .

Pregunta = texto
Respuesta1 = texto
Respuesta2 = texto
Respuesta3 = texto
Respuesta4 = texto
Respuesta_correcta = 4

queria crear un campo respuesta_texto con el texto de la respuesta. Se puede?

mi consulta en mysql

Código MySQL:
Ver original
  1. FROM `Tests_Preguntes`,`Preguntes` , `Tests`
  2. WHERE `Id_Test` = '".$CodiTest."'
  3. AND `Tests_Preguntes`.Id_Pregunta = `Preguntes`.Id
  4.  AND  `Preguntes`.Id_TipoC = `Tests`.Id_TipoC
  5. ORDER BY `Posicio`;



gracias

Última edición por gnzsoloyo; 18/02/2013 a las 11:59
  #2 (permalink)  
Antiguo 18/02/2013, 13:17
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consulta mysql controlando un campo y generando otro

Hola dfgphp:

No nos dices cuál es la estructura de cada una de tus tablas, ni nos dices qué información contienen cada una de ellas... sin esta información resulta casi imposible darte una respuesta puntual... ojo con eso. Puedes checar este script, igual y te puede servir para lo que quieres.

Para el ejemplo, voy a suponer que toda la información está en una sola tabla, es decir, algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   pregunta, respuesta_1, respuesta_2, respuesta_3, respuesta_correcta
  3.     -> FROM tabla;
  4. +------------------+-------------+-------------+-------------+--------------------+
  5. | pregunta         | respuesta_1 | respuesta_2 | respuesta_3 | respuesta_correcta |
  6. +------------------+-------------+-------------+-------------+--------------------+
  7. |Descubrio America | Napoleon    | Colon       | Cortes      | 2 |
  8. |Conquista Europa  | Napoleon    | Colon       | Cortes      | 1 |
  9. |Conquista America | Napoleon    | Colon       | Cortes      | 3 |
  10. +-------------------+-------------+-------------+-------------+--------------------+
  11. 3 rows in set (0.00 sec)

Observa que en la última columna está el valor de la columna que contiene la respuesta correcta... podrías utilizar un CASE-WHEN para hacer lo que quieres, así:

Código MySQL:
Ver original
  1. mysql> SELECT pregunta, respuesta_1, respuesta_2, respuesta_3,
  2.     -> CASE respuesta_correcta
  3.     ->   WHEN 1 THEN respuesta_1
  4.     ->   WHEN 2 THEN respuesta_2
  5.     ->   WHEN 3 THEN respuesta_3
  6.     -> END texto_correcto
  7.     -> FROM tabla;
  8. +-------------------+-------------+-------------+-------------+----------------+
  9. | pregunta          | respuesta_1 | respuesta_2 | respuesta_3 | texto_correcto |
  10. +-------------------+-------------+-------------+-------------+----------------+
  11. | Descubrio America | Napoleon    | Colon       | Cortes      | Colon          |
  12. | Conquista Europa  | Napoleon    | Colon       | Cortes      | Napoleon       |
  13. | Conquista America | Napoleon    | Colon       | Cortes      | Cortes         |
  14. +-------------------+-------------+-------------+-------------+----------------+
  15.  
  16. 3 rows in set (0.01 sec)

Igual y esta no es la mejor respuesta, pero sin una idea de tu modelo de datos es lo mejor que puedo hacer.

Y finalmente una recomendación: No utilices el FROM-WHERE para hacer las uniones entre tus tablas, utiliza siempre JOIN's...

Código MySQL:
Ver original
  1. En lugar de hacer esto:
  2.  
  3. FROM tabla1, tabla2 WHERE tabla1.campo = tabla2.campo
  4.  
  5. Has esto:
  6.  
  7. FROM tabla1 INNER JOIN tabla2 ON tabla1.campo = tabla2.campo

Saludos
Leo.
  #3 (permalink)  
Antiguo 18/02/2013, 16:50
 
Fecha de Ingreso: diciembre-2011
Ubicación: pontevedra
Mensajes: 17
Antigüedad: 12 años, 4 meses
Puntos: 0
Respuesta: Consulta mysql controlando un campo y generando otro

Hola Leo gracias por contestar tan pronto , buena idea me diste para probar , solo me queda un tema , si se la respuesta_correcta para los campos incorrectos tendria que generar de nuevo los campos de respuestas , nose si me explico bien .Como estan mezclados no puedo copiar todos como estan ? Tendria que generar todos los campos de respuestas incorrectas + la correcta .

paso la imagen de la tabla Preguntes.

  #4 (permalink)  
Antiguo 18/02/2013, 17:20
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: Consulta mysql controlando un campo y generando otro

Lo que tienes es un error básico: No creas un campo por respuesta. Creas una tabla para las respuestas relacionadas con la tabla de preguntas.
Necesitas estudiar y entender el modelo Entidad - Relación, antes de seguir avanzando, porque te faltan conceptos fundamentales, y estás cometiendo errores gravísimos de ,diseño.
__________________
¿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 19/02/2013, 03:24
 
Fecha de Ingreso: diciembre-2011
Ubicación: pontevedra
Mensajes: 17
Antigüedad: 12 años, 4 meses
Puntos: 0
Respuesta: Consulta mysql controlando un campo y generando otro

Si puede ser el error basico , pero lo que estoy tratando es pasar preguntas de una base de datos ordenarla y guardarla en otra base distinta . No estoy generando la tabla desde cero.
Y mi duda es como hacerlo si estan todas desordenadas y la respuesta correcta cae en cualquier sitio de las 4 respuestas.
Al terminar me pondre a leer lo que me dices seguro en el manual de mysql lo encuentro.

Gracias por los consejos , son todos bienvenidos para un novato como yo.

dfgphp
  #6 (permalink)  
Antiguo 19/02/2013, 04:23
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: Consulta mysql controlando un campo y generando otro

Cita:
lo que me dices seguro en el manual de mysql lo encuentro.
No. Los manuales de los diferentes DBMS asumen que el lector conoce los fundamentos de bases de datos.
Por otro lado, estás poniendo el carro delante del caballo: Si tienes que migrar los datos de una base a otra, deberías aprovechar para hacerlo hacia una base mínimamente bien diseñada, o de lo contrario lo único que lograrás será tener problemas a corto plazo.

...y no es tan difícil. Solamente requiere un poquito de esfuerzo.

La idea sería simplemente algo aproximadamente así

Código MySQL:
Ver original
  1. CREATE TABLE Pregunta(
  2. pregunta_id INT UNSIGNED PRIMARY KEY,
  3. pregunta VARCHAR(300)
  4. );
  5. CREATE TABLE Respuesta(
  6. pregunta_id INT UNSIGNED,
  7. respuesta_subId INT UNSIGNED,
  8. respuesta VARCHAR(300),
  9. correcta BOOLEAN,
  10. PRIMARY KEY(pregunta_id, respuesta_subId));

Para poder llenar la primera tabla sería mas o menos:

Código MySQL:
Ver original
  1. INSERT INTO pregunta
  2. SELECT id pregunta_id, pregunta
  3. FROM Preguntas;

Y para llenar las respuestas algo como:
Código MySQL:
Ver original
  1. INSERT INTO respuesta
  2. SELECT pregunta_id, respuesta_subId, respuesta, correcta
  3.     (SELECT pregunta_id, 1 respuesta_subId, respuesta1, (respuesta_correcta = 1) correcta
  4.     FROM Preguntas
  5.     UNION
  6.     SELECT pregunta_id, 2 respuesta_subId, respuesta2, (respuesta_correcta = 2) correcta
  7.     FROM Preguntas
  8.     UNION
  9.     SELECT pregunta_id, 3 respuesta_subId, respuesta3, (respuesta_correcta = 3) correcta
  10.     FROM Preguntas
  11.     UNION
  12.     SELECT pregunta_id, 4 respuesta_subId, respuesta4, (respuesta_correcta = 4) correcta
  13.     FROM Preguntas
  14.     ORDER BY 1, 2
  15.     ) t1
  16. ORDER BY pregunta_id, respuesta_subId;

Usando este esquema de pregunta/respuestas, una pregunta dada puede tener N respuestas posibles, y además puede hacerse que la misma pregunta tenga una, muchas o ninguna respuesta correcta.
Es decir, es una forma flexible de crear cuestionarios.

Nota: Falta agregar la FK en Respuesta apuntando a la PK de Pregunta.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 19/02/2013 a las 09:08
  #7 (permalink)  
Antiguo 20/02/2013, 10:54
 
Fecha de Ingreso: diciembre-2011
Ubicación: pontevedra
Mensajes: 17
Antigüedad: 12 años, 4 meses
Puntos: 0
Respuesta: Consulta mysql controlando un campo y generando otro

Hola gnzsoloyo , me podrias indicar algun manual para descargar o comprar , para ver los fundamentos de bases de datos.

un saludo

dfgphp

Etiquetas: Ninguno
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 09:03.