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

Relacionar dos tablas

Estas en el tema de Relacionar dos tablas en el foro de Mysql en Foros del Web. Hola. Llevo tiempo haciendo cosas con php y mysql pero nunca había tocado el tema de relaciones entre tablas. Me ha surgido un proyecto en ...
  #1 (permalink)  
Antiguo 27/06/2011, 08:13
 
Fecha de Ingreso: junio-2011
Mensajes: 2
Antigüedad: 12 años, 9 meses
Puntos: 0
Relacionar dos tablas

Hola.
Llevo tiempo haciendo cosas con php y mysql pero nunca había tocado el tema de relaciones entre tablas. Me ha surgido un proyecto en el cual tengo dos tablas en una bbdd.

En una tabla "preguntas" para un test, con un campo id, uno para enunciado, cuatro respuestas y un campo con la correcta.
La otra tabla "tests" va a contener los datos de los tests: un id, un nombre, tiempo y 50 preguntas.

La idea es que el usuario pueda crear los tests seleccionando preguntas de la tabla "preguntas" mediante formularios y al grabar se registre la id de cada pregunta en la posición elegida de la tabla "tests".

El problema es que no se como hacer la consulta para que al solicitar los datos de "tests" se obtengan los campos correspondientes de "preguntas".

Solo con un poco de orientación ya me daría por satisfecho. Gracias.
  #2 (permalink)  
Antiguo 27/06/2011, 09:12
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Relacionar dos tablas

Hola karles200:

En lo particular te propondría un modelo con tres tablas en lugar de dos:

Una tabla de PREGUNTAS tal y como lo propones, una tabla de TESTS donde almacenes el id, el nombre y el tiempo para el test y una tercer tabla TESTS_PREGUNTAS donde puedas asignar las preguntas de cada test.

Código MySQL:
Ver original
  1. mysql> create table preguntas (id_pregunta int, enunciado varchar(50),
  2.     -> respuesta_1 varchar(30),respuesta_2 varchar(30),
  3.     -> respuesta_3 varchar(30),respuesta_4 varchar(30),respuesta_correcta int);
  4. Query OK, 0 rows affected (0.05 sec)
  5.  
  6. mysql> insert into preguntas values
  7.     -> (1, '¿Quién descubrió América?', 'Cristobal Colón',
  8.     -> 'Napoleón Bonaparte', 'Aristóteles', 'Américo Vespicio', 1),
  9.     -> (2, '¿Quién logró la conquista de México?', 'Cristobal Colón',
  10.     -> 'Hernán Cortés', 'Napoleón Bonaparte', 'Hugo Sánchez', 2),
  11.     -> (3, '¿De que color es caballo blanco de Napoléon?', 'Negro',
  12.     -> 'Café', 'Blanco', 'Gris', 3),
  13.     -> (4, '¿En qué país nació Napoleón Bonaparte?', 'España',
  14.     -> 'Alemania', 'México', 'Francia', 4);
  15. Query OK, 4 rows affected (0.03 sec)
  16. Records: 4  Duplicates: 0  Warnings: 0
  17.  
  18. mysql> create table tests(id_test int, nombre varchar(30), duracion int);
  19. Query OK, 0 rows affected (0.08 sec)
  20.  
  21. mysql> insert into tests values
  22.     -> (1, 'Historia de México', 60),
  23.     -> (2, 'Historia Universal', 60);
  24. Query OK, 2 rows affected (0.03 sec)
  25. Records: 2  Duplicates: 0  Warnings: 0
  26.  
  27. mysql> create table tests_preguntas (id_t_p int, id_test int, id_pregunta int);
  28. Query OK, 0 rows affected (0.08 sec)
  29.  
  30. mysql> insert into tests_preguntas values (1,1,1), (2,1,2),
  31.     -> (2,2,1),(3,2,2),(4,2,3),(5,2,4);
  32. Query OK, 6 rows affected (0.03 sec)
  33. Records: 6  Duplicates: 0  Warnings: 0
  34.  
  35. mysql> #Para obtener las preguntas del Test "Historia de México"
  36. mysql> select P.Enunciado from preguntas P inner join tests_preguntas TP
  37.     -> on TP.id_pregunta = P.id_pregunta where TP.id_test = 1;
  38. +--------------------------------------+
  39. | Enunciado                            |
  40. +--------------------------------------+
  41. | ¿Quién descubrió América?            |
  42. | ¿Quién logró la conquista de México? |
  43. +--------------------------------------+
  44. 2 rows in set (0.01 sec)
  45.  
  46. mysql> #Para obtener las preguntas del Test "Historia Universal"
  47. mysql> select P.Enunciado from preguntas P inner join tests_preguntas TP
  48.     -> on TP.id_pregunta = P.id_pregunta where TP.id_test = 2;
  49. +----------------------------------------------+
  50. | Enunciado                                    |
  51. +----------------------------------------------+
  52. | ¿Quién descubrió América?                    |
  53. | ¿Quién logró la conquista de México?         |
  54. | ¿De que color es caballo blanco de Napoléon? |
  55. | ¿En qué país nació Napoleón Bonaparte?       |
  56. +----------------------------------------------+
  57. 4 rows in set (0.00 sec)

Como verás de esta manera puedes reutilizar el banco de preguntas para distintos exámenes. Por cuestiones de presentación en el select sólo estoy recuperando el enunciado, pero podrías recuperar todos los campos de tu tabla preguntas poniendo simplemente P.* en lugar de P.Enunciado

Espero sinceramente que esto te pueda ser de ayuda.

Saludos
Leo.
  #3 (permalink)  
Antiguo 27/06/2011, 15:30
 
Fecha de Ingreso: junio-2011
Mensajes: 2
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Relacionar dos tablas

Muchisimas gracias, no se me había ocurrido que la solución pasara por crear una tabla adicional.

Etiquetas: relacionar, tablas
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 10:41.