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

Consulta de access a mysql

Estas en el tema de Consulta de access a mysql en el foro de Mysql en Foros del Web. Hola, espero que me puedan ayudar con este problema, tengo 2 consultas consulta1 y consulta 2 que respectivamente estas 2 consultas en access me arrojan ...
  #1 (permalink)  
Antiguo 25/01/2010, 15:06
Roa
 
Fecha de Ingreso: marzo-2009
Mensajes: 13
Antigüedad: 15 años, 1 mes
Puntos: 0
Consulta de access a mysql

Hola, espero que me puedan ayudar con este problema, tengo 2 consultas consulta1 y consulta 2 que respectivamente estas 2 consultas en access me arrojan datos y de esos datos arrojados vuelvo a hacer otra consulta este es el ejemplo

SELECT [consulta1].ID_auditoria, [consulta2].[Tipo de tarea]
FROM [consulta1] LEFT JOIN [consulta2] ON [consulta1].ID_auditoria = [consulta2].ID_auditoria
GROUP BY [consulta1].ID_auditoria, [consulta2].[Tipo de tarea], [consulta2].ID_auditoria
HAVING ((([consulta2].ID_auditoria) Is Null));

Ne cesito traspasar este tipo de consultas a MySql, No soy experto en mysql, pero necesito mas o menos saber como empezar a resolver esto si es con subconsultas dentro de consultas, o crear tablas temporales para luego crear las consultas, ojala que me hechen una manito pleasee

Saludos
  #2 (permalink)  
Antiguo 25/01/2010, 15:37
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, 5 meses
Puntos: 2658
Respuesta: Consulta de access a mysql

Código MySQL:
Ver original
  1. SELECT C1.ID_auditoria, C2.Tipo de tarea
  2. FROM consulta1 C1 LEFT JOIN consulta2 C2 ON C1.ID_auditoria = C2.ID_auditoria
  3. WHERE C2.ID_auditoria IS NULL
  4. GROUP BY C1.ID_auditoria, C2.Tipo de tarea, C2.ID_auditoria;
__________________
¿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 25/01/2010, 15:58
Roa
 
Fecha de Ingreso: marzo-2009
Mensajes: 13
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Consulta de access a mysql

Gracias gnzsoloyo por contestar, mira talvez no me supe explicar, disculpa de antemano.


consulta 1 (C1)
SELECT
auditorias.ID_auditoria,`tipos de tareas`.`Tipo de tarea`
FROM(SELECT
auditorias.ID_auditoria,
`tipos de tareas`.`Tipo de tarea`
FROM
auditorias
Inner Join `asignacion de tareas` ON auditorias.ID_auditoria = `asignacion de tareas`.Auditoria
Inner Join tareas ON `asignacion de tareas`.Tarea = tareas.ID_tareas
Inner Join `tipos de tareas` ON tareas.Tipo = `tipos de tareas`.ID_tipo_tarea
Left Join avance ON avance.Tarea = `asignacion de tareas`.ID_asignacion
WHERE
avance.ID_avance IS NULL
GROUP BY
auditorias.ID_auditoria,
`tipos de tareas`.`Tipo de tarea`)
auditorias
Inner Join avance
Inner Join tareas
Inner Join `tipos de tareas` ON tareas.Tipo = `tipos de tareas`.ID_tipo_tarea
Inner Join `asignacion de tareas` ON `asignacion de tareas`.Auditoria = auditorias.ID_auditoria AND `asignacion de tareas`.ID_asignacion = avance.Tarea AND tareas.ID_tareas = `asignacion de tareas`.Tarea
GROUP BY
auditorias.ID_auditoria,
`tipos de tareas`.ID_tipo_tarea
ORDER BY
auditorias.ID_auditoria ASC,
`tipos de tareas`.ID_tipo_tarea ASC


Consulta2(c2)
SELECT
auditorias.ID_auditoria,
`tipos de tareas`.`Tipo de tarea`
FROM
auditorias
Inner Join `asignacion de tareas` ON auditorias.ID_auditoria = `asignacion de tareas`.Auditoria
Inner Join tareas ON `asignacion de tareas`.Tarea = tareas.ID_tareas
Inner Join `tipos de tareas` ON tareas.Tipo = `tipos de tareas`.ID_tipo_tarea
Left Join avance ON avance.Tarea = `asignacion de tareas`.ID_asignacion
WHERE
avance.ID_avance IS NULL
GROUP BY
auditorias.ID_auditoria,
`tipos de tareas`.`Tipo de tarea`


y en access tengo esta consulta (la misma que me resolviste)

SELECT C1.ID_auditoria, C2.Tipo de tarea
FROM consulta1 C1 LEFT JOIN consulta2 C2 ON C1.ID_auditoria = C2.ID_auditoria
WHERE C2.ID_auditoria IS NULL
GROUP BY C1.ID_auditoria, C2.Tipo de tarea, C2.ID_auditoria;

La idea es como reemplazar esa tremenda consulta (c1) y (c2)

Gracias
  #4 (permalink)  
Antiguo 25/01/2010, 17:17
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, 5 meses
Puntos: 2658
Respuesta: Consulta de access a mysql

Todavía estoy tratando de entender lo que has puesto pero desde ya, a primera vista, es una consulta absolutamente redundante, como pocas veces he visto.
Si se analiza con cuidado pareciera que se está llamando cuatro veces al mismo modelo de consulta y cruzando las cuatro veces los mismos parámetros de JOIN.
En esencia, la consulta base sería esta:
Código MySQL:
Ver original
  1.     AU.ID_auditoria,
  2.     TT.`Tipo de tarea`
  3.   FROM
  4.     auditorias AU
  5.     INNER JOIN `asignacion de tareas` AT ON AU.ID_auditoria = AT.Auditoria
  6.     INNER JOIN tareas TA ON TA.Tarea = AT.ID_tareas
  7.     INNER JOIN `tipos de tareas` TT ON TA.Tipo = TT.ID_tipo_tarea
  8.     LEFT JOIN avance AV ON AT.Tarea = AV.ID_asignacion
  9.     AV.ID_avance IS NULL;
que parece destinada a obtener toda la lista de tareas auditables, a las que se ha asignado al menos una tarea, con la indicación que qué tarea(s) tiene y a qué tipo pertenecen, todas las cuales no hayan tenido ningún avance.
Por otro lado se vuelve a cruzar con todas para conocer las tareas que efectivamente hayan tenido un avance (en principio esto debería dar NULL lógicamente porque son incompatibles).
Luego tienes la segunda consulta, que en esencia parecer ser idéntica a la original, con sólo un cambio de orden de las tablas, como en el punto anterior...

Mira, si lo que quieres es obtener la lista de tareas auditables, a las que se ha asignado al menos una tarea, con la indicación que qué tarea(s) tiene y a qué tipo pertenecen, todas las cuales hayan tenido o no algún avance, la sentencia que debería lograrlo es la sentencia original con sólo un cambio:
Código MySQL:
Ver original
  1.     AU.ID_auditoria,
  2.     TT.`Tipo de tarea`
  3.   FROM
  4.     auditorias AU
  5.     INNER JOIN `asignacion de tareas` AT ON AU.ID_auditoria = AT.Auditoria
  6.     INNER JOIN tareas TA ON TA.Tarea = AT.ID_tareas
  7.     INNER JOIN `tipos de tareas` TT ON TA.Tipo = TT.ID_tipo_tarea
  8.     LEFT JOIN avance AV ON AT.Tarea = AV.ID_asignacion
  9.     AV.ID_avance OR AV.ID_avance IS NULL
  10.   ORDER BY AU.ID_auditoria, TT.ID_tipo_tarea
  11.   GROUP BY AU.ID_auditoria, TT.ID_tipo_tarea;
o bien hacer un UNION con dos consultas con las condiciones alternadas...

Explícame qué es exactamente lo que debe mostrar el reporte, a ver si por allí podemos reducir este código a algo menos redundante.
__________________
¿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 26/01/2010, 06:30
Roa
 
Fecha de Ingreso: marzo-2009
Mensajes: 13
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Consulta de access a mysql

Gracias gnzsoloyo por contestar, mira lo que exactamente la consulta muestre "Auditorias con todas sus tareas completadas" y eso me tiene liado, atento a tus comentarios.

Saludos

Última edición por Roa; 26/01/2010 a las 06:52
  #6 (permalink)  
Antiguo 26/01/2010, 07:15
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, 5 meses
Puntos: 2658
Respuesta: Consulta de access a mysql

Si lo que determina que una tarea está completada es que el ID de esa tarea aparezca en la tabla AVANCE, lo que debe suceder es que la cantidad de tareas diferentes en `Tareas Asignadas` debe ser igual a la cantidad de tareas de ese proyecto en Avance.
Con esa restricción sabemos que esto:
Código MySQL:
Ver original
  1.     AU.*
  2.   FROM
  3.     auditorias AU
  4.     INNER JOIN `asignacion de tareas` AT ON AU.ID_auditoria = AT.Auditoria
  5.   GROUP BY AU.ID_auditoria;
Devolvería todos los datos de las auditorias que tengan tareas asignadas.
De estas auditorías necesitas saber cuáles nolo han completado. Eso se obtiene cruzando una consulta similar con Avance y obtener los ID de las audotirías que tengan al menos un registro en Avance en NULL (en eso estaba bien pensado.
Lo que no es necesario es cruzar en este punto los datos con las otras tablas, que para lo único que sirven es para obtener detalles de las tareas. Eso bien lo puedes hacer con la tabla resultado, y para saber qué tareas se realizaron, pero la consigna que propones no lo dice (regla básica: no poner nada que no se requiera, consume recursos innecesariamente).

En definitiva, algo así:
Código MySQL:
Ver original
  1.     AU.*
  2.   FROM
  3.     auditorias AU
  4.     INNER JOIN `asignacion de tareas` AT ON AU.ID_auditoria = AT.Auditoria
  5.   WHERE
  6.      AU.ID_auditoria NOT IN
  7.           (SELECT AU.ID_auditoria
  8.            FROM auditorias AU
  9.                    INNER JOIN `asignacion de tareas` AT ON AU.ID_auditoria = AT.Auditoria
  10.                    LEFT JOIN `Avance` AV ON AT.Tarea = AV.ID_asignacion
  11.            WHERE AV.ID_asignacion IS NULL
  12.            GROUP BY AU.ID_auditoria) TAV
  13.   GROUP BY AU.ID_auditoria;
La idea de la consulta es que excluya de las auditorias con tareas asignadas aquellas que tengan alguna tarea incompleta
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 27/01/2010, 10:44
Roa
 
Fecha de Ingreso: marzo-2009
Mensajes: 13
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Consulta de access a mysql

Hola gnzsoloyo, gracias por contestar de nuevo, ayer estube fuera de la ofi todo el dia, analize tu consulta, esta bien pero...
sabiendo que estamos tratando de conseguir esta consulta:
"Auditorias con todas sus tareas completadas"
tengo 2 tablas llamadas:

Código HTML:
Tabla Asignacion tarea (at) (se cargan las tareas a una auditoria)
id_asignacion      auditoria     tarea
   1                1              23
   2                1              44
   3                1              54
   4                2              23
   5                2              12
   6                3              22
   7                3              36

Tabla avance(av)
Id_avance        id_asignacion
1                  1
2                  2
3                  3
4                  4
5                  8
6                  9
7                 10
Como puedo saber que una auditoria esta completada?, creo que puede ser at.id_asignacion sea igual a la cantidad de av.id_asignacion asociada a una auditoria, es este caso la auditoria 1 tiene sus tareas completadas, en cambio la auditoria 2 solo hay un solo registro asociado av.id_asignacion que es el 4.

tambien podemos sacar otra consulta "auditorias que NO Registran avance alguno" en este caso la auditoria 3 ya que no registra ninguna asignacion de tarea en cambio la auditoria 2 tiene al menos 1 registro asociado a av.id_asignacion que es la id_asignacion 4.
He probado y no me resulta :(
Gracias y Saludos
  #8 (permalink)  
Antiguo 28/01/2010, 07:13
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta de access a mysql

Con independencia de lo que quieres hacer en este caso.

Primero debes tener en cuenta que tanto los "objetos" como la sintaxis de Access no son Sql estandar (como casi todo lo que hace MS), luego cuidado.

Aun y asi el concepto mas parecido a lo que en acces se le llama "Consultas" son lo que en Sql estandar se llama Vistas. Es decir definciones de consultas que se guardan y se pueden usar como si fueran tablas (en algunos casos incluso para actualizar datos).

En Sql estandar por consulta o en ingles query se entiende como una sentencia Sql ejecutable, la cual usara tablas o vistas para optener unos datos o resultados. Estas como tu apuntas pueden tener subconsultas.

El problema que planteas por tanto se puede trasladar de Acces a MySql de dos formas:

1.- Creas las dos Vistas (MySql 5 o superior) y aplicas la primera solucion que te dio gnzsoloyo subtituyendo cosulta1 C1 y cosulta2 C2 por el nombre que le hayas puesto a las Vistas.

2.- Usas las sentencias de cada una para construir la cunsulta conjunta siguiendo el esquema:

SELECT lista de campos
FROM (Sentencia de la primera consulta) alias
JOIN
(sentencia de la segunda consulta) alias.

(con esto tambien podrias crear una vista)

Es decir pones toda la sentencia de la consulta entre partentesis donde pondrias el nombre de una tabla o de una vista y le asignas un alias.

Todo esto con independencia de si las consultas que nos has puesto estan bien formuladas o no.

Quim

Última edición por quimfv; 28/01/2010 a las 07:18
  #9 (permalink)  
Antiguo 28/01/2010, 09:47
Roa
 
Fecha de Ingreso: marzo-2009
Mensajes: 13
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Consulta de access a mysql

Gracias Quim, me dejaste más claro los conceptos voy hacer lo que me dices, lo hare y les cuento.. ahh y tambien gracias a gnzsoloyo

saludos
  #10 (permalink)  
Antiguo 28/01/2010, 14:26
Roa
 
Fecha de Ingreso: marzo-2009
Mensajes: 13
Antigüedad: 15 años, 1 mes
Puntos: 0
De acuerdo Respuesta: Consulta de access a mysql

Gracias .... ya me salio el resultado que estimaba con las vistas y las querys


Etiquetas: access
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 20:32.