Ver Mensaje Individual
  #3 (permalink)  
Antiguo 06/03/2013, 09:47
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 11 meses
Puntos: 447
Respuesta: Repeticion de resultados en consulta

Hola tuvieja:

El problema que tienes es que se está realizando un producto cartesiano entre tus tablas ya que no especificas ninguna relación entre las tablas... es decir, debe existir uno o más campos que relacionen los registros de las tablas. Checa este ejemplo. Supongamos que tenemos dos tablas con los siguientes datos:

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)

Es claro que ambas tablas están relacionadas por el campo id, supongamos ahora que queremos obtener el id = 1 de ambas tablas... tal como lo haces tu sería así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1, tabla2
  2.     -> WHERE tabla1.id = 1;
  3. +------+-------------+------+-------------+
  4. | id   | descripcion | id   | descripcion |
  5. +------+-------------+------+-------------+
  6. |    1 | uno         |    1 | one         |
  7. |    1 | uno         |    2 | two         |
  8. |    1 | uno         |    3 | three       |
  9. +------+-------------+------+-------------+
  10. 3 rows in set (0.00 sec)

Esto es justamente un producto cartesiano, es decir, combinar un cada elemento de la tabla1 con todos los elementos de la tabla2. Para evita esto, sólo tienes que poner las relaciones que existen entre las tablas:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1
  2.     -> INNER JOIN tabla2 ON tabla1.id = tabla2.id
  3.     -> WHERE tabla1.id = 1;
  4. +------+-------------+------+-------------+
  5. | id   | descripcion | id   | descripcion |
  6. +------+-------------+------+-------------+
  7. |    1 | uno         |    1 | one         |
  8. +------+-------------+------+-------------+
  9. 1 row in set (0.02 sec)

Observa que en la cláusula ON tengo esta condición tabla1.id = tabla2.id que es la que relaciona ambas tablas.

Es preferible que utilices JOIN's en lugar del listar las tablas en el FROM separadas por comas. Evita justamente estos productos cartesianos y tiene un mejor rendimiento. aunque también funciona:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1, tabla2
  2.     -> WHERE tabla1.id = tabla2.id AND tabla1.id = 1;
  3. +------+-------------+------+-------------+
  4. | id   | descripcion | id   | descripcion |
  5. +------+-------------+------+-------------+
  6. |    1 | uno         |    1 | one         |
  7. +------+-------------+------+-------------+
  8. 1 row in set (0.00 sec)

Observa que en el WHERE se agrega la misma condición que en el ON. Te repito que no recomiendo que lo hagas de esta manera, el ejemplo es meramente ilustrativo.

Saludos
Leo.