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

estructura de consulta mysql

Estas en el tema de estructura de consulta mysql en el foro de Mysql en Foros del Web. Hola todos los foreros... espero que todo ande bien.... pues les comento la duda que tengo. Resulta que necesito realizar una consulta donde me muestre ...
  #1 (permalink)  
Antiguo 02/05/2011, 14:27
 
Fecha de Ingreso: marzo-2010
Ubicación: Cali
Mensajes: 203
Antigüedad: 14 años, 1 mes
Puntos: 5
Pregunta estructura de consulta mysql

Hola todos los foreros... espero que todo ande bien.... pues les comento la duda que tengo. Resulta que necesito realizar una consulta donde me muestre algo asi como el historial de un documento (estado y fecha). ejemplo hay tres tiposn de estado en que debe pasar todo ducumento: completo, comunicado y expedido o en su defecto si no fue expedido entonces: desistido.... en la base de datos se guarda asi:

id_docuemnto estado fecha
1 completo 2011-03-01
1 comunicado 2011-03-05


asi sucesivamente se van guardan los estados por lo que pasa o se encuentra el documento con su respectiva fecha... el inconveniento es necesito que quede con esta estructura:

id_documento fecha_completo fecha_comunicado
1 2011-03-01 2011-03-05

esa es la gran duda que tengo no se como hacer para que qued e la estructura antes mencionada... cualquier ayuda o guia que me puedan dar les estare muy agradecido.

de antemano muchas gracias por su atencion y su tiempo
  #2 (permalink)  
Antiguo 02/05/2011, 15:04
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: estructura de consulta mysql

Tendrías que hacer dos subconsultas y unirlas con un join.

Primero, seleccionas los elementos que tengan estado = 'comunicado', mostrando sólo el id y la fecha

Segundo, seleccionas los elementos que tengan estado = 'completo', mostrando sólo el id y la fecha

Realizas una reunión natural entre las dos tablas y renombras la fecha de la primera como fecha_comunicado y la de la segunda como fecha_completado.

Ahora es tu trabajo pasarlo a una consulta SQL que debería ser fácil con lo que te he dicho.
  #3 (permalink)  
Antiguo 02/05/2011, 15:33
 
Fecha de Ingreso: marzo-2010
Ubicación: Cali
Mensajes: 203
Antigüedad: 14 años, 1 mes
Puntos: 5
Respuesta: estructura de consulta mysql

Hola alex primero que todo gracias por tu respuesta y ayuda.. te comnto realize lo que me mencionate pero me sale error... esta es la consulta que estoy utilizando:

Código MySQL:
Ver original
  1. select r.nro_radicado, r.categoria, l.fecha_licencia, (select a.fecha from alertas a where tipo like 'completo' and r.nro_radicado = a.nro_radicado) as comunicado, (select a.fecha from alertas a, radicado r where tipo = 'desistido' and r.nro_radicado = a.nro_radicado) as desistido from radicado r, licencias l where r.id_radicado = l.id_radicado and l.tipo_licencia like 'CONSTRUCCION' and r.categoria <> 'ninguna'

y este es el error que me lanza...

Subquery returns more than 1 row

espero me puedas ayudar.. de anteado muchas gracias
  #4 (permalink)  
Antiguo 02/05/2011, 15:54
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: estructura de consulta mysql

No puedes utilizar la salida de una consulta como si fuese un dato simple, porque normalmente devuelven, como bien te indica, más de una fila.

Me refiero a:


Código SQL:
Ver original
  1. SELECT r.nro_radicado, r.categoria, l.fecha_licencia,
  2. (SELECT a.fecha FROM alertas a WHERE tipo LIKE 'completo' AND r.nro_radicado = a.nro_radicado) AS
  3. comunicado

Esa subconsulta no va a funcionar a no ser que la subconsulta devolviese un dato simple.

Creo que no has entendido a lo que me refería.

Te voy a poner un ejemplo con lo que tu me ponias como ejemplo para que veas:

Código SQL:
Ver original
  1. SELECT id_documento, T1.fecha AS fecha_comunicado, T2.fecha AS fecha_completo
  2. (SELECT id_documento, fecha
  3. FROM tabla
  4. WHERE estado = 'comunicado') AS T1
  5. NATURAL INNER JOIN
  6. (SELECT id_documento, fecha
  7. FROM tabla
  8. WHERE estado = 'completo') AS T2

Lo que he visto es que lo que intentas hacer no es lo que tu me habias puesto como ejemplo, asi que si quieres que te ayudemos más tienes que darnos los datos más completos posibles.

A ver si con el ejemplo que te he puesto consigues lo que necesitas.
  #5 (permalink)  
Antiguo 03/05/2011, 08:43
 
Fecha de Ingreso: marzo-2010
Ubicación: Cali
Mensajes: 203
Antigüedad: 14 años, 1 mes
Puntos: 5
Respuesta: estructura de consulta mysql

Hola alex, espero que estés bien. de nuevo muchas gracias por tu ayuda. quiero comentarte que utilice tu ejemplo y pues claramente adapte tu estructura a mi tabla pero pues me sale error... de verdad me apena mucho molestarte pero soy algo nuevo en esto.. mira aquí te dejo mi código y de antemano muchas gracias por tu ayuda...

Código MySQL:
Ver original
  1. SELECT id, T1.fecha AS fecha_comunicado, T2.fecha AS fecha_completo,
  2. (SELECT id, fecha
  3. FROM alertas
  4. WHERE tipo = 'completo') AS T1
  5. (SELECT id, fecha
  6. FROM alertas
  7. WHERE tipo = 'desistido') AS T2
  #6 (permalink)  
Antiguo 03/05/2011, 09:15
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: estructura de consulta mysql

Perdona, esta claro que mi consulta estaba mal y se debe a que la clave primaria de la tabla no es sólo id seguramente.

Los problemas eran varios:
  1. Había una coma de más, la que esta en negrita:
    Código:
    SELECT id, T1.fecha AS fecha_comunicado, T2.fecha AS fecha_completo, 
  2. Faltaba un FROM , el que está en negrita:

    Código:
    SELECT id, T1.fecha AS fecha_comunicado, T2.fecha AS fecha_completo,
    FROM (SELECT id, fecha
    FROM alertas
    WHERE tipo = 'completo') AS T1
    NATURAL INNER JOIN
    (SELECT id, fecha
    FROM alertas
    WHERE tipo = 'desistido') AS T2
    

Otro problema era que no se puede hacer con un natural inner join porque este realiza la union de todos los campos que sean iguales y el campo fecha también es igual.

Se puede hacer así:


Código SQL:
Ver original
  1. SELECT T1.id, T1.fecha AS fecha_completo, T2.fecha AS fecha_desistido
  2. FROM
  3. (SELECT id, fecha
  4. FROM alertas
  5. WHERE tipo = 'completo') AS T1
  6. INNER JOIN
  7. (SELECT id, fecha
  8. FROM alertas
  9. WHERE tipo = 'desistido') AS T2
  10. ON (T1.id=T2.id)

o así:

Código SQL:
Ver original
  1. SELECT *
  2. FROM
  3. (SELECT id, fecha AS fecha_completo
  4. FROM alertas
  5. WHERE tipo = 'completo') AS T1
  6. NATURAL INNER JOIN
  7. (SELECT id, fecha AS fecha_desistido
  8. FROM alertas
  9. WHERE tipo = 'desistido') AS T2

Espero que este bien ahora.
  #7 (permalink)  
Antiguo 03/05/2011, 09:33
 
Fecha de Ingreso: marzo-2010
Ubicación: Cali
Mensajes: 203
Antigüedad: 14 años, 1 mes
Puntos: 5
Respuesta: estructura de consulta mysql

HOLA ALEX DE NUEVO GRACIAS...:) TE COMENTO QUE UTILIZE AMBOS CODIGOS Y EL SEGUNDO ME GENERA ERROR. eL PRIMERO SI APARECE QUE LA CONSULTA FUE EJECUTADA EXITOSAMENTE PERO NO ME MUESTRA NINGUN REGISTRO, EN CAMBIO SE LE CAMBIO EL INNER JOIN POR UN LEFT JOIN ME MUESTRA REGISTROS PERO SOLO DE LOS DOCUMENTOS COMPLETOS MAS NO DE LOS DESISTIDOS

QUE RARO ESO :(
  #8 (permalink)  
Antiguo 03/05/2011, 09:37
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: estructura de consulta mysql

Hola andruxand:

El problema de utilizar subconsultas en la parte del select tal y como lo comenta alexg88 es que las subconsultas deberán de regresar siempre una columna y un registro

Prueba con esto:

Código MySQL:
Ver original
  1. select distinct T1.id_documento,
  2. T2.fecha as fecha_comunicado,
  3. T3.fecha as fecha_completo
  4. from alertas T1
  5. inner join alertas T2
  6. on T1.id_documento = T2.id_documento and T2.estado = 'comunicado'
  7. inner join alertas T3
  8. on T1.id_documento = T3.id_documento and T3.estado = 'completo'

Aquí me quedaron algunas dudas con respecto a tu información, por ejemplo, si cada id_documento tiene sólo un registro con estatus comunicado y completo, o es posible que tenga más de un registro, así mismo deberías de decirnos si cada id_documento debe tener los dos estatus, o es posible que tenga solo alguno de ellos. Si es este último caso, deberás utilizar LEFT JOIN's en lugar de los INNER JOIN's. te dejo el script completo que utilicé para hacer pruebas:

Código MySQL:
Ver original
  1. mysql> create table alertas (id_documento int, estado varchar(20), fecha datetim
  2. e);
  3. Query OK, 0 rows affected (0.44 sec)
  4.  
  5. mysql> insert into alertas values
  6.     -> (1, 'completo', '2011-03-01'),
  7.     -> (1, 'comunicado', '2011-03-05'),
  8.     -> (2, 'completo', '2011-03-02'),
  9.     -> (2, 'comunicado', '2011-03-04'),
  10.     -> (3, 'completo', '2010-08-14'),
  11.     -> (3, 'comunicado', '2010-12-21');
  12. Query OK, 6 rows affected (0.05 sec)
  13. Records: 6  Duplicates: 0  Warnings: 0
  14.  
  15. mysql> select * from alertas;
  16. +--------------+------------+---------------------+
  17. | id_documento | estado     | fecha               |
  18. +--------------+------------+---------------------+
  19. |            1 | completo   | 2011-03-01 00:00:00 |
  20. |            1 | comunicado | 2011-03-05 00:00:00 |
  21. |            2 | completo   | 2011-03-02 00:00:00 |
  22. |            2 | comunicado | 2011-03-04 00:00:00 |
  23. |            3 | completo   | 2010-08-14 00:00:00 |
  24. |            3 | comunicado | 2010-12-21 00:00:00 |
  25. +--------------+------------+---------------------+
  26. 6 rows in set (0.03 sec)
  27.  
  28. mysql> select distinct T1.id_documento,
  29.     -> T2.fecha as fecha_comunicado,
  30.     -> T3.fecha as fecha_completo
  31.     -> from alertas T1
  32.     -> inner join alertas T2
  33.     -> on T1.id_documento = T2.id_documento and T2.estado = 'comunicado'
  34.     -> inner join alertas T3
  35.     -> on T1.id_documento = T3.id_documento and T3.estado = 'completo';
  36. +--------------+---------------------+---------------------+
  37. | id_documento | fecha_comunicado    | fecha_completo      |
  38. +--------------+---------------------+---------------------+
  39. |            1 | 2011-03-05 00:00:00 | 2011-03-01 00:00:00 |
  40. |            2 | 2011-03-04 00:00:00 | 2011-03-02 00:00:00 |
  41. |            3 | 2010-12-21 00:00:00 | 2010-08-14 00:00:00 |
  42. +--------------+---------------------+---------------------+
  43. 3 rows in set (0.00 sec)
  #9 (permalink)  
Antiguo 03/05/2011, 09:47
 
Fecha de Ingreso: marzo-2010
Ubicación: Cali
Mensajes: 203
Antigüedad: 14 años, 1 mes
Puntos: 5
Respuesta: estructura de consulta mysql

hola leonardo ya probe y funciono lo unico que me toco cambiar fue los inner join por left join.. de verdad mchas gracias a ti y a alex por su gran colaboracion :)
  #10 (permalink)  
Antiguo 03/05/2011, 12:16
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: estructura de consulta mysql

Yo he probado las dos consultas que te indico
pero todo depende de la estructura de tus tablas, yo sólo he podido suponer lo que tenías.

Me alegro que tengas solucionado el problema.

Etiquetas: estructura
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 04:44.