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

Eliminar registros duplicados de consulta con 3 tablas

Estas en el tema de Eliminar registros duplicados de consulta con 3 tablas en el foro de Mysql en Foros del Web. Que tal amigos, les ecribo por lo siguiente: Necesito hacer una consulta que me involucre 3 tablas, estas 3 tablas estan relacionadas o unidas por ...
  #1 (permalink)  
Antiguo 18/10/2012, 09:28
Avatar de Bullet  
Fecha de Ingreso: agosto-2005
Ubicación: Margarita, Venezuela
Mensajes: 235
Antigüedad: 18 años, 8 meses
Puntos: 1
Eliminar registros duplicados de consulta con 3 tablas

Que tal amigos, les ecribo por lo siguiente:

Necesito hacer una consulta que me involucre 3 tablas, estas 3 tablas estan relacionadas o unidas por el numero de cruero (crno) y el numero de lance (setno), vienen de una planilla llamada "Registro de Lance de palangre", la cual tuve que dividir en 3 tablas por lo largo e ilegible que se hacia, la consulta ya la arme, y me da el resultado que yo quiero, la consulta es la siguiente:
Código MySQL:
Ver original
  1. FROM ll_rl,ll_cl,ll_map
  2. where ll_rl.crno ='22001'
  3.     and ll_rl.setno='201'
  4.     and  ll_cl.crno ='22001'
  5.     and ll_cl.nlance='201'
  6.     and  ll_map.crno ='22001'
  7.     and ll_map.nlance='201'
el detalle que tengo es que en las tablas ll_rl y ll_map, se repiten los registros tantas veces como registros posee la tabla ll_cl, por ejemplo, si la tabla ll_cl tiene 5 registros, la consulta repite 4 veces los registros de las otras tablas... Mi pregunta es: Hay alguna manera de optimizar la consulta, de manera que esto no suceda?

Espero su respuesta. Saludos...

Última edición por gnzsoloyo; 18/10/2012 a las 09:54
  #2 (permalink)  
Antiguo 18/10/2012, 09:46
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 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.

Etiquetas: duplicados, registros, select, tabla, tablas
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 23:21.