Ver Mensaje Individual
  #4 (permalink)  
Antiguo 20/12/2011, 19:43
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: Duda con Consulta SQL

Es un problema que se produce cuando se usan funciones agrupadas sobre diferentes columnas provenientes de diferentes tablas en un JOIN multitabla. En realidad lo que sucede es que realiza los JOIN antes de hacer la operación de la función, y como la cardinalidad es superior a 1, genera un producto cartesiano no previsto, antes de hacer la el agrupamiento.
La única solución es hacer que las diferentes tablas de datos se consoliden antes de usarlas en un JOIN, de modo que cuando este se haga la relación tenga cardinalidad 1 en todos los casos.
Hace unos días alguien preguntó por un caso similar, sólo que era con tres tablas, nada más.
La idea sería mas o menos:
Código MySQL:
Ver original
  1.     UD.num_doc,
  2.     CONCAT(UD.last_name, ', ', UD.first_name) nombre,
  3.     CONCAT('$', ROUND((T.training_cost - (T.training_cost * PP.payment_plan_discount/100)),2)) tot_a_pagar,
  4.     CONCAT('$', ROUND(UP.user_paid, 2)) tot_pagado,
  5.     CONCAT('$', ROUND((T.training_cost - (T.training_cost * PP.payment_plan_discount / 100)) - (UP.user_paid),2)) saldo,
  6.     UP.paid_date ultimo_pago
  7.     users_data UD
  8.     INNER JOIN
  9.         (SELECT MAX(paid_date), SUM(user_paid) user_paid, id_user, paid_date
  10.         FROM users_payment
  11.         GROUP BY id_user) UP
  12.         ON UD.id_user = UP.id_user
  13.     INNER JOIN users_payment_plans UPP
  14.         ON UD.id_user = UPP.id_user
  15.     INNER JOIN payment_plans PP
  16.         ON UPP.payment_plan_id = PP.payment_plan_id
  17.     INNER JOIN users_trainings UT
  18.         ON UD.id_user = UT.id_user
  19.     INNER JOIN training T
  20.         ON UT.id_training = T.training_id
  21. GROUP BY UD.num_doc

Por cierto: Trata de usar ALIAS para simplificar la sintaxis, y procura no usar JOIN sólo. Define mejor la operación para que el parser utilice el algoritmo más eficiente.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)