Ver Mensaje Individual
  #2 (permalink)  
Antiguo 18/10/2012, 09:46
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Eliminar registros duplicados de consulta con 3 tablas

Hola Bullet:

Lo que está pasando se llama producto cartesiano, y es ocasionado porque no estás definiendo ninguna relación entre tus tablas, observa este ejemplo, supongamos que tienes estas dos tablas;

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    1 | UNO         |
  6. |    2 | DOS         |
  7. |    3 | TRES        |
  8. +------+-------------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT * FROM tabla2;
  12. +------+-------------+
  13. | id   | descripcion |
  14. +------+-------------+
  15. |    1 | ONE         |
  16. |    2 | TWO         |
  17. |    3 | THREE       |
  18. +------+-------------+
  19. 3 rows in set (0.00 sec)

Observa que la relación entre tus tablas esta dada por el campo ID, y que sería de uno a uno, tu estás haciendo algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1, tabla2
  2.     -> WHERE tabla1.id IN (1, 3);
  3. +------+-------------+------+-------------+
  4. | id   | descripcion | id   | descripcion |
  5. +------+-------------+------+-------------+
  6. |    1 | UNO         |    1 | ONE         |
  7. |    3 | TRES        |    1 | ONE         |
  8. |    1 | UNO         |    2 | TWO         |
  9. |    3 | TRES        |    2 | TWO         |
  10. |    1 | UNO         |    3 | THREE       |
  11. |    3 | TRES        |    3 | THREE       |
  12. +------+-------------+------+-------------+
  13. 6 rows in set (0.00 sec)

Esto es un producto cartesiano y lo que hace es relacionar cada elemento de la tabla1 con cada elemento de la tabla2. Lo que tienes que hacer es simplemente definir las relaciones entre tus tablas. Yo te recomiendo que hagas uso de los JOIN's, así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1
  2.     -> INNER JOIN tabla2 ON tabla1.id = tabla2.id
  3.     -> WHERE tabla1.id IN (1, 3);
  4. +------+-------------+------+-------------+
  5. | id   | descripcion | id   | descripcion |
  6. +------+-------------+------+-------------+
  7. |    1 | UNO         |    1 | ONE         |
  8. |    3 | TRES        |    3 | THREE       |
  9. +------+-------------+------+-------------+
  10. 2 rows in set (0.00 sec)

Observa que en la cláusula ON se especifican los campos por los que están relacionados las tablas. También lo puedes hacer en el WHERE, aunque no lo recomiendo en absoluto.

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1, tabla2
  2.     -> WHERE tabla1.id = tabla2.id AND
  3.     -> tabla1.id IN (1, 3);
  4. +------+-------------+------+-------------+
  5. | id   | descripcion | id   | descripcion |
  6. +------+-------------+------+-------------+
  7. |    1 | UNO         |    1 | ONE         |
  8. |    3 | TRES        |    3 | THREE       |
  9. +------+-------------+------+-------------+
  10. 2 rows in set (0.01 sec)

Saludos
Leo.