Tema: Order by
Ver Mensaje Individual
  #10 (permalink)  
Antiguo 09/03/2013, 14:46
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: 17 años
Puntos: 2658
Respuesta: Order by

Mira, no se ve puntualmente un error, pero preventivamente vamos a hacer un pequeño cambio, para evitar que el último ORDER BY pueda estar generando conflictos:
Código MySQL:
Ver original
  1.     (SELECT
  2.         d.llave, cy.rfc, d.fecha, d.folio, c.nombre, d.subtotal,
  3.         d.iva, d.isr, d.iva2, d.cancelado
  4.     FROM
  5.         $tabla d
  6.         LEFT JOIN cbb_clientes c on c.llave=d.cliente
  7.         LEFT JOIN cbb_contribuyentes cy ON cy.llave=d.contribuyente
  8.     WHERE
  9.         c.usuario = '$k_usuario'
  10.         AND cy.llave = '$contribuyente'
  11.         AND YEAR(d.fecha) = $ano
  12.         AND MONTH(d.fecha) = $mesx
  13.         $condicion
  14.         AND d.folio = 0
  15.         ORDER BY d.llave) T0
  16.     SELECT *
  17.     FROM
  18.         (SELECT
  19.             d2.llave, cy2.rfc, d2.fecha, d2.folio, c2.nombre, d2.subtotal,
  20.             d2.iva, d2.isr, d2.iva2, d2.cancelado
  21.         FROM $tabla d2
  22.             LEFT JOIN cbb_clientes c2 on c2.llave=d2.cliente
  23.             LEFT JOIN cbb_contribuyentes cy2 on cy2.llave=d2.contribuyente
  24.         WHERE
  25.             c2.usuario = '$k_usuario'
  26.             AND cy2.llave = '$contribuyente'
  27.             AND YEAR(d2.fecha) = $ano
  28.             AND MONTH(d2.fecha) = $mesx
  29.             $condicion
  30.             AND d2.folio <> 0
  31.         ORDER BY d2.folio ASC) T1;

Algunos tips adicionales:
- No pongas entre apostrofos aquellos valores que son números. No los necesitan y usarlos puede esconder errores en las variables que los alimentan (si me dices que los pones para evitar que salten errores, es precisamente que algo está mal con esas variables).
- El orden de los factores si altera el producto en las bases de datos. Pon las tablas en el orden de dependencia o el de cardinalidad, por lo menos, en especial cuando usas LEFT JOIN.
- No abuses de los paréntesis. El parser de MySQL los usa para cambiar la lógica de análisis, y por tanto pueden tener un mal impacto en la performance (poner un conjunto de condiciones con AND entre paréntesis es inútil).
- Ten cuidado con las condiciones que llegan como variables (esa $condiciones). Si contiene OR sin controlar puede afectar la lógica de la consulta sin que te enteres.
- El ORDER BY final ordena toda la tabla resultado, incluyendo todo lo de todas las consultas intermedias. No es la solución. Ante la duda es siempre conveniente que leas el manual ()

Finalmente, un consejo que siempre damos:
No uses la consulta directamente en una llamada, sino que cárgala en una variable, luego imprime la variable (echo) para asegurarte qué estás enviando, y recién entonces mandala a ejecutar.
¿Se entiende esto último?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)