Ver Mensaje Individual
  #7 (permalink)  
Antiguo 17/09/2012, 06:38
Avatar de gnzsoloyo
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: Select para 3 tablas.

Mi duda respecto a ese WHERE es que en realidad no filtra nada, por lo que parece pedir es todo aquello que comience con cualquier cosa, y termine con cualquier cosa... Es decir, todo.
Entonces no se ve para qué lo pones, porque daría lo mismo que sin ello.

En cuanto al resto de la sintaxis, es correcta, pero como estás usando INNER JOIN y no LEFT JOIN en algunas de las relaciones, sólo devolverá datos si hay coincidencias en todas las tablas al mismo tiempo.

Es decir, sólo saldrán aquellos usuarios que tengan dirección declarada que tengan aparatos declarados, y posean avisos.
El problema de duplicidad que puedes encontrar es que un INNER JOIN de esas características, donde todas las tablas se relacionan con una única tabla, pero no tienen dependencias entre ellas, tienden a generar un producto cartesiano. Es un caso especial del producto cartesiano.
Me explico:
Las tablas de usuario y dirección te devuelven un registro por cada dirección del usuario. Pero como puede haber más de una, te puede devolver más de una vez a algunos usuarios.
Esa tabla derivada generada por el primer INNER JOIN se cruzará con la de aparatos, una vez por cada aparato, en cada una de las apariciones del usuario en la derivada, pero ésta instancia del usuario.
A su vez, cuando se cruce con los avisos, lo hará por cada usuario que a parezca en la segunda derivada... por cada aviso de ese usuario.
En definitiva se puede formar un producto cartesiano así:
100 usuarios con 2 direcciones cada uno: 200 registros (2 por usuario)
200 usuarios duplicados) por cinco aparatos cada usuario: 1.000 registros.
1.000 registros por 3 avisos por usuario: 3.000 registros.
Es decir que:
- Cada dirección de cada usuario aparecerá 150 veces
- Cada usuario aparecerá 300 veces.
- Cada aparato aparecerá 1500 veces.
- Cada aviso aparecerá 900 veces.

El tema es que no puedes relacionar toda esas tablas en forma de estrella, sino que tienen que tener una relación lineal. De lo contrario deberás hacer consultas separadas.
Es decir:
- Un usuario
tiene 1:N direcciones (Relación usuario <- direccion).
- En cada direccion publica 1:N avisos (relación usuario+direccion <-> avisos).
- Cada aviso es sobre un aparato (relación usuario+direccion+aviso <- aparato).
Entonces es una dependencia bastante diferente a la que planteas.

¿Se entiende el problema?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)