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

Consulta base de datos

Estas en el tema de Consulta base de datos en el foro de Mysql en Foros del Web. Cordial saludo. Tengo una tabla llamada "tema" que es donde los administradores de la aplicacion crean el tema y le asignan unos item al tema ...
  #1 (permalink)  
Antiguo 20/10/2014, 13:26
 
Fecha de Ingreso: septiembre-2013
Ubicación: Bogota
Mensajes: 139
Antigüedad: 11 años, 2 meses
Puntos: 0
Consulta base de datos

Cordial saludo. Tengo una tabla llamada "tema" que es donde los administradores de la aplicacion crean el tema y le asignan unos item al tema para que un grupo de personas respondan el tema cada uno con su usuario y contraseña. Cada tema tiene un estado de cambio. Es decir, cuando el tema es creado va a tener el tema en "Tema Creado", y asi sucesivamente. el problema es que cuando un usuario responda el tema "deberia" cambiar el estado del tema a "Tema respondido" obviamente para que el tema no sea respondido dos veces por un mismo usuario. pero si lo cambio de estado a la primera vez que lo responden despues los otros usuarios no lo van a poder responder y la idea es que cuando ese usuario lo responda cambie el estado a "Tema respondido" para él no mas, de forma que siga visible para los que no lo han respondido aún.

Tabla "tema":

+-------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+----------------+
| cod_tema | int(11) | NO | PRI | NULL | auto_increment |
| dtalle_tema | char(80) | NO | | | |
| cod_estado | int(11) | NO | MUL | | |
| cod_admin | int(11) | NO | MUL | | |
+-------------+----------+------+-----+---------+----------------+

Tabla "dilig_cuest";

+-----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+----------------+
| cod_dilig_cuest | int(11) | NO | PRI | NULL | auto_increment |
| cod_experto | int(11) | NO | MUL | | |
| cod_tema | int(11) | NO | MUL | | |
| color | char(1) | NO | | | |
| justificacion | varchar(500) | NO | | | |
+-----------------+--------------+------+-----+---------+----------------+

La tabla "tema" es donde se crean los temas y la tabla "dilig_cuest" es donde los usuarios responden el tema.

Me colaboran con alguna idea por favor. Gracias.
  #2 (permalink)  
Antiguo 21/10/2014, 01:57
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: Consulta base de datos

En la tabla "dilig_cuest", (para que ese nombre tan criptico?) tienes las respuestas de TODOS los usuarios, luego solo tienes que agregarle el identificador del usuario que ha dado la respuesta y listos.

Eso te servirá para dos cosas:

1.-Saber que ha contestado cada usuario
2.-Saber quien ha costestado el tema

Luego si alguien ha contestado no le muestras el tema.

El campo " cod_experto" no será el codigo del usuario?

Guardas el campo "cod_estado" para "caducar" para todos los usuarios el tema.

Si "cod_experto" es el codigo de usuario

Código MySQL:
Ver original
  1. SELECT  cod_tema
  2. FROM dilig_cuest
  3. WHERE cod_experto=X;

Estos serian los temas que ha respondido X


Código MySQL:
Ver original
  1. SELECT t.*
  2. FROM tema t
  3.         LEFT JOIN (SELECT  cod_tema
  4.                            FROM dilig_cuest
  5.                            WHERE cod_experto=X) Sbc
  6.                ON t.cod_tema=Sbc.cod_tema
  7. WHERE Sbc.cod_tema IS NULL;

Estos los que NO ha respondido.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 21/10/2014 a las 02:04
  #3 (permalink)  
Antiguo 24/10/2014, 19:39
 
Fecha de Ingreso: septiembre-2013
Ubicación: Bogota
Mensajes: 139
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Consulta base de datos

Hola gracias por responder. Por favor me puedes explicar con un poco de detalle la consulta

Código MySQL:
Ver original
  1. SELECT t.*
  2. FROM tema t
  3.         LEFT JOIN (SELECT  cod_tema
  4.                            FROM dilig_cuest
  5.                            WHERE cod_experto=X) Sbc
  6.                ON t.cod_tema=Sbc.cod_tema
  7. WHERE Sbc.cod_tema IS NULL

Es que la verdad no soy tan avanzada. Gracias.

Última edición por andre___5025; 24/10/2014 a las 19:51 Razón: genero
  #4 (permalink)  
Antiguo 25/10/2014, 02:22
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: Consulta base de datos

Deascompongamosla,

primero vemos la subquery, es muy sencilla

Código MySQL:
Ver original
  1. SELECT cod_tema
  2. FROM dilig_cuest
  3. WHERE cod_experto=X

Seleccionamos los codigos de tema que ha respondido el experto X, no tiene secreto. Encerrada entre parentesis la podemos usar como si fuera otra tabla, solo tenemos que ponerle un alias, en este caso Sbc, de subconsulta.

Luego hacemos LEFT JOIN de esa subquery con la tabla temas, el modificador LEFT provoca que se obtengan TODOS los registros de la tabla de la izquierda, temas, combinados o no con los de la tabla de la derecha, en este caso la subquery. La clausula ON t.cod_tema=Sbc.cod_tema indica cual es el campo que vincula las tablas, en este caso se ve modificado por LEFT, se podria leer como todos los que sean iguales y los que el segundo termino de la igualdad sea nulo (ojo si estan puestos en el mismo orden que las tablas)

RegistroDeLaIzquierdaCod_Tema1-RegistroDeLaDerechaCod_Tema1
RegistroDeLaIzquierdaCod_Tema2-Null
RegistroDeLaIzquierdaCod_Tema3-RegistroDeLaDerechaCod_Tema3


Finalmente en el WHERE pedimos que solo retorne aquellos en que el registro de la derecha sea nulo.

Como a la derecha tenemos los temas que ha contestado X y a la izquierda todos los temas, por diferencia obtenemos los que NO ha contestado.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 25/10/2014 a las 02:29

Etiquetas: tabla
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 13:48.