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

Consulta de tres tablas

Estas en el tema de Consulta de tres tablas en el foro de Mysql en Foros del Web. Hola, tengo un problemilla que se me esta resistiendo y paso por aquí a ver si pueden ayudarme. Quiero hacer una consulta de 3 tablas ...
  #1 (permalink)  
Antiguo 26/12/2012, 07:07
 
Fecha de Ingreso: septiembre-2011
Mensajes: 13
Antigüedad: 12 años, 7 meses
Puntos: 0
Consulta de tres tablas

Hola, tengo un problemilla que se me esta resistiendo y paso por aquí a ver si pueden ayudarme.

Quiero hacer una consulta de 3 tablas : "Registros", "Auditoria", "Ciudad".

Deseo sacar las auditorias de un registro concreto de una ciudad concreta (puede tener de 1 a X mensajes de auditoria).

-Auditoria almacena una clave ajena de registros.
-Registros almacena una clave ajena de ciudad.


De momento tengo el siguiente codigo:

SELECT a.code, f.message
FROM annotations a, organizations o, folderlog f
WHERE a.code = "1200-12"
AND o.name = "Madrid"
AND f.annotation_id = a.id
AND o.id = a.organizationId;
  #2 (permalink)  
Antiguo 27/12/2012, 06:23
 
Fecha de Ingreso: septiembre-2011
Mensajes: 13
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Consulta de tres tablas

Voy afinandolo más.... Creo que la pregunta es ¿como hago una especie de bucle (WHILE ?) en ese IN?

Únicamente me queda como poder sacar lo siguiente, tengo este codigo:

Código MySQL:
Ver original
  1. SELECT a.id, a.code, f.DTYPE, f.version, f.entryDate, f.message,
  2. f.transactionId, f.folder_id, f.user_id, f.assignedTo_id,
  3. u.username, u.name, o.id, o.name
  4. FROM annotations a, organizations o, folderlogh f, users u
  5.  
  6. WHERE a.id IN (SELECT a.id
  7. FROM annotations a
  8. WHERE a.code = "1420-21312")
  9.  
  10. AND a.id = f.annotation_id
  11. AND o.id = "323ff240-61fa-451c-9bbc-809fd0fdeb0c"
  12. AND o.id = a.organizationId
  13. AND f.organizationId = o.id
  14. AND f.organizationId = a.organizationId
  15. AND u.id = f.user_id;


Hay diferentes ID'S, con este codigo consigo que me saque la primera de la lista solo. Como podria hacer que me fuera sacando una a una???

Última edición por baruc; 27/12/2012 a las 06:59
  #3 (permalink)  
Antiguo 27/12/2012, 07:22
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 de tres tablas

JOINs implícitos no son buena práctica, especialmente con muchos registros.
Por otro lado, esa subconsulta en el IN busca en la misma tabla que ya estás usando en la consulta base, por lo que bien puedes filtrar ese parámetro en la mayor.
Además de eso, no pones los alias en columnas que tienen el mismo nombre, por lo que luego tendrás problemas de acceso al dato obtenido, y usas palabras reservadas en las columnas, lo que es muy mala idea.
Una versión simplificada sería:
Código MySQL:
Ver original
  1.     a.ID AnotId,
  2.     a.code AnotCode,
  3.     f.dtype FolderDType,
  4.     f.VERSION FolderVersion,
  5.     f.entrydate FolderFAlta,
  6.     f.MESSAGE FolderMens,
  7.     f.transactionid FolderTrId,
  8.     f.folder_id FolderId,
  9.     f.user_id FolderUserId,
  10.     f.assignedto_id FolderAsignA,
  11.     u.username,
  12.     u.NAME UserNomb,
  13.     o.ID Org_id,
  14.     o.NAME OrgNonmb
  15.   FROM annotations a
  16.        INNER JOIN organizations o ON (a.organizationid = o.ID)
  17.        INNER JOIN folderlogh f ON (a.organizationid = f.organizationid AND a.ID = f.annotation_id AND o.ID = f.organizationid)
  18.        INNER JOIN users u ON (f.user_id = u.ID)
  19.        a.code = "1420-21312"
  20.    AND o.ID = "323ff240-61fa-451c-9bbc-809fd0fdeb0c";
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 28/12/2012, 02:59
 
Fecha de Ingreso: septiembre-2011
Mensajes: 13
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Consulta de tres tablas

Con mensajes así se aprende mucho, se agradece. Hasta ahora me ha valido tal y como hacía las consultas pero me doy cuenta y aún más con estos mensajes de que no es lo apropiado...

Yendo al tema, he probado su código y me sale el mismo resultado... Me saca los resultados de una sola a.ID, cuando varias a.ID pueden estar asociadas al -> a.code = "1420-21312"

Alguien sabe alguna solución para ello?
  #5 (permalink)  
Antiguo 28/12/2012, 03:40
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 de tres tablas

Cita:
Me saca los resultados de una sola a.ID, cuando varias a.ID pueden estar asociadas al -> a.code = "1420-21312"
Estás mirando mal la cosa.
Puede ser cierto que en el campo "code" de la tabla "annotations" haya múltiples registros donde aparezca el valor "1420-21312", pero sólo hay un único registro donde se cumplen todas las otras condiciones que propones al mismo tiempo, y en esa consulta tu estás poniendo cinco (5) restricciones de integridad relacional y dos condiciones de filtrado, o sea siete condiciones que cumplir.
Ese es el tema.
Los JOINs que planteas son mandatorios, por lo que sólo devolverá registros si se cumplen todos.
Ahora bien, si quieres efectivamente que devuelva todos los registros de la tabla anotations que tengan ese valor en ese campo, deberás determinar qué relaciones con las otras tablas son en realidad opcionales, es decir, valores no mandatorios, o cuáles no están cumpliendo las restricciones.
Cuando un valor es opcional hay que usar LEFT JOIN o RIGHT JOIN según el caso, pero para ello hay que adaptar la sintaxis y orden de las tablas a fin de evitar productos cartesianos o resultados erróneos por cadenas de dependencias mal definidas.
En definitiva, quiero que entiendas dos cosas:
1) Si devuelve lo mismo que lo que desarrollaste, significa que la lógica simplificada de lo que te propongo es equivalente, solo que más optimizado, cosa que notarás con muuuuchos datos.
2) No existe "error" en la consulta, sino en todo caso restricciones que no se están cumpliendo, o datos que en realidad no están relacionados o no están completos.
__________________
¿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: registros, select, tabla, tablas, tres
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 18:35.