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

[SOLUCIONADO] Consulta que no repita los campos con UNION

Estas en el tema de Consulta que no repita los campos con UNION en el foro de Mysql en Foros del Web. Hola, saludos nuevamente me gustaria de su ayuda ya que tengo dos problemas en esta consulta. (SELECT O.id,p.nombre proceso, O.tema, O.descripcion, O.fecha_brecha, O.importancia, O.estatus, D.plan_accion, ...
  #1 (permalink)  
Antiguo 04/06/2013, 13:02
 
Fecha de Ingreso: octubre-2008
Mensajes: 101
Antigüedad: 15 años, 6 meses
Puntos: 1
Pregunta Consulta que no repita los campos con UNION

Hola, saludos nuevamente me gustaria de su ayuda ya que tengo dos problemas en esta consulta.

(SELECT O.id,p.nombre proceso, O.tema, O.descripcion, O.fecha_brecha, O.importancia, O.estatus, D.plan_accion, D.fecha_entrega, R.nombre
FROM detalle_observaciones D, responsables R, observaciones O, Procesos P
WHERE O.id_proceso = P.id_proceso
AND O.id = D.id_observacion
AND R.id = D.id_responsable ORDER BY 1)

UNION

(SELECT O.id, p.nombre proceso, O.tema, O.descripcion, O.fecha_brecha, O.importancia, O.estatus,
SPACE(30) plan_accion, CURDATE() fecha, SPACE(30) nombre
FROM observaciones O, Procesos P
WHERE O.id_proceso = P.id_proceso ORDER BY 1)

La cuestion es que en la primera consulta me extrae las observaciones con sus comentarios, pero el segundo unicamente me extrae los comentarios y con el union los extraigo y los muestro.

Pero tengo dos problemas al respecto:

1) Necesito que el campo curdate del segundo select, me aparezca en blanco, es decir solo se cree el campo.

2) Necesito que no se repitan las campos, ya que en este caso como pueden ver, se repetira los registros de la consulta 1 con la 2

Necesito un poco de su ayuda por favor, para generar esta consulta! :(
  #2 (permalink)  
Antiguo 04/06/2013, 13:16
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consulta que no repita los campos con UNION

Hola head777

No me quedó claro qué es lo que necesitas, pero veamos:

Cita:
1) Necesito que el campo curdate del segundo select, me aparezca en blanco, es decir solo se cree el campo.
si no quieres que tenga el valor CURDATE() pues quita el CURDATE() , es decir, si sólo quiere que se creé el campo, puedes hacerlo así:

Código:
...
SPACE(30) plan_accion, NULL fecha, SPACE(30) nombre
...
De hecho es algo parecido a lo que tienes con SPACE(30), que por cierto no es muy recomendable... siempre es preferible asignar valores nulos (NULL) en lugar de cadenas vacias ('') o cadenas de espacios en blancos como es el caso.

Cita:
2) Necesito que no se repitan las campos, ya que en este caso como pueden ver, se repetira los registros de la consulta 1 con la 2
En realidad no entiendo este punto (aunque en realidad no entiendo ni siquiera por qué tienes que hacer un UNION)... en la primer consulta ya estás la tabla PROCESOS Y OBSERVACIONES, por lo tanto no entiendo qué es lo que pretendes hacer... creo que sería conveniente antes de tratar de mejorar la consulta que tienes, que nos digas qué es lo que estás tratando de hacer, así, de ser posible te podremos indicar alguna otra manera de hacerlo.

Finalmente una recomendación que hemos repetido infinidad de veces en este y otros foros de BD: No hagas la unión de tus tablas en el FROM-WHERE. En lugar de esto:

Código:
...
FROM tabla1, tabla2 WHERE tabla1.campo = tabla2.campo
...
Haz esto:

Código:
...
FROM tabla1 INNER JOIN tabla2 ON tabla1.campo = tabla2.campo
...
Si tienes dudas en cómo funcionan los distintos tipos de JOIN's, preguntale a Santa WIKIPEDIA:

http://es.wikipedia.org/wiki/Join

Saludos
Leo.
  #3 (permalink)  
Antiguo 04/06/2013, 13:33
 
Fecha de Ingreso: octubre-2008
Mensajes: 101
Antigüedad: 15 años, 6 meses
Puntos: 1
Pregunta Respuesta: Consulta que no repita los campos con UNION

Hola, pues gracias por tu pronta respuesta y entiendo tu punto con respecto al campo null, lo que pasa es que VFP, se utiliza siempre el campo space y las {} cuando quieres crear campos fechas en un cursor, y no tenia de como utilizarlo en mysql.

Pues siguiendo con lo del union, veras la cuestion es la siguiente: Quiero consolidar la informacion, si te fijas en el primer select, se extraen las observaciones con sus respectivos comentarios, pero como no cumplen todas las observaciones con el where(Por que no todas las observaciones tiene comentarios), por eso solo me muestra los que tienen comentarios que dependen de ellos, por eso hice el segundo select y con el union queria unirlos, pero el problema es que se repiten.

No se si me he dado a entender esta vez?
  #4 (permalink)  
Antiguo 04/06/2013, 14:31
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta que no repita los campos con UNION

Parece claro que lo que quieres podrías conseguirlo uniendo mediante LEFT JOIN las tablas.

SELECT ... FROM observaciones LEFT JOIN comentarios ON...
Con eso mostrarás todas las observaciones, tengan o no tengan comentarios. Cuando no los tengan aparecerán en NULL los valores de los campos de la tabla comentarios.
  #5 (permalink)  
Antiguo 04/06/2013, 14:33
 
Fecha de Ingreso: octubre-2008
Mensajes: 101
Antigüedad: 15 años, 6 meses
Puntos: 1
Pregunta Respuesta: Consulta que no repita los campos con UNION

Hola, te agradezco tu cordial ayuda, pero ya intente de esta forma tambien. El problema que tengo es que no solo son dos tablas sino que tambien necesito sacar informacion de otras 2 tablas que tiene por ejemplo el nombre del responsable y el proceso al que pertenece.

Pero aqui tengo un ejemplo pero igual me sigue sin funcionar :(

Código:
SELECT O.id, p.nombre proceso, O.tema, O.descripcion, O.fecha_brecha, O.importancia, O.estatus, D.plan_accion, D.fecha_entrega,  R.nombre
FROM  observaciones O LEFT JOIN (detalle_observaciones D, Procesos P, responsables R )
ON O.id = D.id_observacion
WHERE O.id_proceso = P.id_proceso
AND R.id = D.id_responsable
ORDER BY 1
  #6 (permalink)  
Antiguo 04/06/2013, 14:50
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consulta que no repita los campos con UNION

Hola de nuevo:

Creo que no te tomaste el tiempo para leer con detenimiento mi comentario... en el te decía que no conveniente que hicieras las uniones de tus tablas en el FROM-WHERE, incluso te puse la liga para que investigaras cómo funcionan los JOIN's:

http://es.wikipedia.org/wiki/Join

Si te hubieras tomado la delicadeza de leerlo a conciencia te habrías dado cuenta de cómo funcionan y aplicar un LEFT JOIN, tal como recomendó jurena.

lo que estás haciendo es mezclar ambas formas de hacer JOIN y lo estás haciendo mal en ambos casos. No nos pones tampoco cuál es la estructura de tus tablas, ni nos dices en realidad cómo están relacionadas, pero tratando de jugar al adivino creo que la relación sería más o menos así:

Una Observación está asignada a un Proceso
Una Observación Puede tener Detalles o no
Un Detalle está asignado a un Responsable

Si esta suposición es correcta, entonces podrías hacer algo como esto:

Código MySQL:
Ver original
  1.    O.id,p.nombre proceso, O.tema, O.descripcion, O.fecha_brecha, O.importancia,
  2.    O.estatus, D.plan_accion, D.fecha_entrega, R.nombre
  3. FROM observaciones O
  4. INNER JOIN Procesos P ON O.id_proceso = P.id_proceso
  5. LEFT JOIN detalle_observaciones D ON O.id = D.id_observacion
  6. LEFT JOIN responsables R ON R.id = D.id_responsable

CHECA LA LIGA QUE TE PUSE Y OBSERVA LOS CASOS DE EJEMPLO... has algunas consultas de práctica, si esto no funciona y sigues sin conseguir lo que quieres, postea algo de lo que intentaste hacer, pon algunos datos de ejemplo y dinos qué es lo que esperas de salida... con esta información será más fácil tratar de ayudarte.

Saludos
Leo.
  #7 (permalink)  
Antiguo 04/06/2013, 15:22
 
Fecha de Ingreso: octubre-2008
Mensajes: 101
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Consulta que no repita los campos con UNION

Si, tienes razon leonardo_josue la verdad no habia leido como funcionaban los join, lo que pasa es que habia leido que con los union era mas facil, pero igual te agradezco el apoyo, ya que ese tipo de select era el que me hacia falta, pero me habia encerrado solo con el union, pudiendose hacer con el left join.

Te agradezco nuevamente tu apoyo, por que ya tenia media tarde peliando con esto.

Gracias y por eso me alegra pertencer a este foro!

Código:
SELECT
O.id,p.nombre proceso, O.tema, O.descripcion, O.fecha_brecha, O.importancia,
O.estatus, D.plan_accion, D.fecha_entrega, R.nombre
FROM observaciones O
INNER JOIN Procesos P ON O.id_proceso = P.id_proceso
LEFT JOIN detalle_observaciones D ON O.id = D.id_observacion
LEFT JOIN responsables R ON R.id = D.id_responsable
  #8 (permalink)  
Antiguo 04/06/2013, 19:46
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 que no repita los campos con UNION

Una nota final para mayor claridad sobre el uso de UNION:
El UNION se puede usar si y sólo si las subconsultas que lo componen tienen:
1) La misma cantidad de columnas.
2) Las columnas están en el mismo orden.
3) Cada columna de casa subselect coincide en tipo de dato con el resto.
4) Cada columna pertenece al mismo dominio.

Eso último es sumamente importante y es donde tu consulta inicial falla completamente: No puedes mezclar relaciones de diferentes dominios en un UNION, porque estás mezclando caballos con manzanas. Si la primera selección obtenía el detalle de observaciones, los responsables, las observaciones y los procesos, la segunda sólo obtenida observaciones y procesos. No coinciden los dominios de los resultados.
¿Se entiende la idea?
Como las relaciones no son exactamente las misma, no se debe usar un UNION. De allí tu fallo conceptual inicial.

En otras palabras: UNION se debe usar si deseas obtener en una sola consulta subsegmentos de un mismo conjunto resultado, pero parametrizados cada uno en base a diferentes criterios. No es razonable usarlo para agrupar en una misma tabla datos que no responden al dominio (ver concepto dominio de funciones).

Espero que esta aclaración sea útil.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: campo, campos, registros, select, union
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:22.