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

Consulta mysql

Estas en el tema de Consulta mysql en el foro de Mysql en Foros del Web. Buen dia, tengo la siguientes tablas relacionadas: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original mysql > desc dilig_cuest ; +-----------------+--------------+------+-----+---------+----------------+ | Field         ...
  #1 (permalink)  
Antiguo 01/11/2014, 16:37
 
Fecha de Ingreso: septiembre-2013
Ubicación: Bogota
Mensajes: 139
Antigüedad: 10 años, 6 meses
Puntos: 0
Consulta mysql

Buen dia, tengo la siguientes tablas relacionadas:
Código MySQL:
Ver original
  1. mysql> desc dilig_cuest;
  2. +-----------------+--------------+------+-----+---------+----------------+
  3. | Field           | Type         | Null | Key | Default | Extra          |
  4. +-----------------+--------------+------+-----+---------+----------------+
  5. | cod_dilig_cuest | int(11)      | NO   | PRI | NULL    | auto_increment |
  6. | cod_crear_cuest | int(11)      | NO   | MUL |         |                |
  7. | cod_experto     | int(11)      | NO   | MUL |         |                |
  8. | cod_tema        | int(11)      | NO   | MUL |         |                |
  9. | color           | char(1)      | NO   |     |         |                |
  10. | justificacion   | varchar(500) | NO   |     |         |                |
  11. +-----------------+--------------+------+-----+---------+----------------+
  12.  
  13.  
  14. mysql> desc crear_cuest;
  15. +-----------------+--------------+------+-----+---------+----------------+
  16. | Field           | Type         | Null | Key | Default | Extra          |
  17. +-----------------+--------------+------+-----+---------+----------------+
  18. | cod_crear_cuest | int(11)      | NO   | PRI | NULL    | auto_increment |
  19. | cod_tema        | int(11)      | NO   | MUL |         |                |
  20. | numero_item     | char(2)      | NO   |     |         |                |
  21. | item            | varchar(500) | NO   |     |         |                |
  22. | cod_admin       | int(11)      | NO   | MUL |         |                |
  23. +-----------------+--------------+------+-----+---------+----------------+

y tienen los siguientes datos:
Código MySQL:
Ver original
  1. Tabla: crear_cuest
  2. cod_crear_cuest    cod_tema   numero_item    item                                                   cod_admin
  3. 187                         18               1                 importancia de calidad de los suelos           1
  4. 188                         18               2                 fertilizacion de los cafetales                          1
  5.  
  6.  
  7. Tabla: dilig_cuest
  8.  
  9. cod_dilig_cuest  cod_crear_cuest    cod_experto cod_tema       color     justificacion
  10. 152                           187                    10                18         A   fhfhfghgfhfghfg
  11. 153                           187                    10                18         N   ffdgdfgdfgdf

Y tengo la siguiente consulta:
Código MySQL:
Ver original
  1. SELECT dilig_cuest. cod_tema, crear_cuest.cod_tema, dilig_cuest. cod_dilig_cuest,
  2.    dilig_cuest.cod_crear_cuest, dilig_cuest.color, dilig_cuest.justificacion,
  3.    crear_cuest.cod_crear_cuest, crear_cuest.numero_item, crear_cuest.item, dilig_cuest.color,dilig_cuest.justificacion, dilig_cuest.cod_experto
  4. FROM dilig_cuest,crear_cuest
  5. WHERE dilig_cuest.cod_tema=crear_cuest.cod_tema
  6.    AND dilig_cuest.cod_tema='$_GET[id]'
  7.    AND dilig_cuest.cod_experto=$codigo_experto

Cita:
Editado: Código de programación no permitido en foros de Bases de Datos.
Leer las normas del foro, por favor.
El problema es que me muestra los resultados doble vez. pero necesito que solo se muestre una vez, estuve utilizando el GROUP BY o el DISTINCT pero no arrojó el resultado que esperaba. Alguien me puede colaborar para que solo muestre el resultado una vez.
Adjunto la muestra del resultado que me está generando actualmente:

http://subefotos.com/ver/?57244f409d...bb492f2eao.jpg

Gracias.

Última edición por gnzsoloyo; 01/11/2014 a las 16:42
  #2 (permalink)  
Antiguo 01/11/2014, 16:47
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

Según tus datos de ejemplo, el campo "cod_tema" de ambas tablas tiene el mismo valor (18) en los dos registros de las dos tablas. En consecuencia ese JOIN implícito genera un producto cartesiano.
Lo que tienes mal definida es la relación. El JOIN debería ser por "cod_crear_cuest".
El otro campo parece indicar una falta de normalización de las tablas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 01/11/2014, 17:25
 
Fecha de Ingreso: septiembre-2013
Ubicación: Bogota
Mensajes: 139
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Consulta mysql

hola gnzsoloyo, gracias por responder. El campo "cod_tema" está en las dos tablas y tiene los mismos registros (18) por que es necesario y se diseño de esa manera para una aplicación que estoy realizando pero bueno, seria una larga historia explicarlo. Hice la sugerencia que me hiciste con el campo "cod_crear_cuest" en la consulta.

Código MySQL:
Ver original
  1. SELECT dilig_cuest.cod_tema,crear_cuest.cod_tema,dilig_cuest.cod_dilig_cuest,dilig_cuest.cod_crear_cuest,dilig_cuest.color,dilig_cuest.justificacion,
  2.                      crear_cuest.cod_crear_cuest,crear_cuest.numero_item,crear_cuest.item,dilig_cuest.color,dilig_cuest.justificacion,
  3.                      dilig_cuest.cod_experto
  4.                 FROM dilig_cuest,crear_cuest
  5.                 WHERE dilig_cuest.cod_crear_cuest=crear_cuest.cod_crear_cuest AND dilig_cuest.cod_tema='$_GET[id]' AND dilig_cuest.cod_experto=$codigo_experto

Resultado de la consulta: el campo "Calificacion" salio bien por que muestra los resultados que son, el campo "justificación" tambien salio bien. el problema ahora es con los campos "numero_item","item" por que me muestra los mismos datos del primer registro consultado. ¿Es posible que por favor me colabores?
Adjunto la imagen del nuevo resultado:

http://subefotos.com/ver/?e1d9f7fd8a...e21d92db9o.jpg
  #4 (permalink)  
Antiguo 01/11/2014, 17:33
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

Cita:
El campo "cod_tema" está en las dos tablas y tiene los mismos registros (18) por que es necesario y se diseño de esa manera para una aplicación que estoy realizando
Eso es un diseño erróneo de datos de todos modos. El hecho de que se necesite para la aplicación no quiere decir que deba replicarse un campo, sino que se debe establecer un mejor modelado de datos que permita, por medio de consultas mejor construidas, obtener los datos que la aplicación requiere.
Replicar un campo porque luego lo necesitas para una aplicación implica dos cosas: 1) Estás acoplando peligrosamente la base a la aplicación, y 2) Estás creando redundancia nociva, que es una de las peores cosas que se pueden hacer en una base.

Cita:
el problema ahora es con los campos "numero_item","item" por que me muestra los mismos datos del primer registro consultado.
Eso ya no es un error, sino una consecuencia natural de una relación 1:N entre dos entidades.
Forzosamente, cuando consultas una relación de ese tipo, la base te devolverá una vez cada registro de la tabla de cardinalidad 1 por cada uno de los registros de cardinalidad N con que se relaciona.
Te toca a tí, en la aplicación, crear la visualización de esos datos de modo que un reporte no repita esas columnas y sólo los muestre la primera vez.
Eso ya no es un tema de SQL sino programación.
__________________
¿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 02/11/2014, 15:46
 
Fecha de Ingreso: septiembre-2013
Ubicación: Bogota
Mensajes: 139
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Consulta mysql

Hola estimado gnzsoloyo. Estuve realizando cambios gracias a tus sugerencias y quiero preguntarte algo:

Mira por favor el modelado de datos actual de las dos tablas:
http://subefotos.com/ver/?b32ac41592...c4cb39a3ao.jpg

Mira los datos que tengo en cada tabla:
tabla "dilig_cuest"
http://subefotos.com/ver/?3edf983ab6...d13185c0ao.jpg

Tabla "crear_cuest"
http://subefotos.com/ver/?b0df4fee13...4416046bbo.jpg

Y al realizar la siguiente consulta:

Código SQL:
Ver original
  1. SELECT crear_cuest.cod_tema,dilig_cuest.cod_dilig_cuest,dilig_cuest.cod_crear_cuest,dilig_cuest.color,dilig_cuest.justificacion,
  2.                      crear_cuest.cod_crear_cuest,crear_cuest.numero_item,crear_cuest.item,dilig_cuest.color,dilig_cuest.justificacion,
  3.                      dilig_cuest.cod_experto
  4.                 FROM dilig_cuest,crear_cuest
  5.                 WHERE dilig_cuest.cod_crear_cuest=crear_cuest.cod_crear_cuest AND crear_cuest.cod_tema='$_GET[id]' AND dilig_cuest.cod_experto=$codigo_experto

Me muestra los registros repetidos así:
http://subefotos.com/ver/?caf225dc55...79e5ca141o.jpg

Sé que lo hace por que al escribir la instrucción
Código SQL:
Ver original
  1. dilig_cuest.cod_crear_cuest=crear_cuest.cod_crear_cuest
está localizando el numero "cod_crear_cuest"=187 de la tabla "crear_cuest" pero la idea es que me muestre los registros del campo "cod_tema" en este caso los dos registros que tienen el numero (18) que es el tema que seleccionó el usuario. Pregunto, ¿Hay una consulta SQL que pueda hacer esto?

Última edición por andre___5025; 02/11/2014 a las 19:52 Razón: Modificación de foto

Etiquetas: select, sql, 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 05:07.