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 d.llave, cy.rfc, d.fecha, d.folio, c.nombre, d.subtotal,
d.iva, d.isr, d.iva2, d.cancelado
$tabla d
LEFT JOIN cbb_contribuyentes cy
ON cy.llave
=d.contribuyente
c.usuario = '$k_usuario'
AND cy.llave
= '$contribuyente' $condicion
d2.llave, cy2.rfc, d2.fecha, d2.folio, c2.nombre, d2.subtotal,
d2.iva, d2.isr, d2.iva2, d2.cancelado
LEFT JOIN cbb_contribuyentes cy2
on cy2.llave
=d2.contribuyente
c2.usuario = '$k_usuario'
AND cy2.llave
= '$contribuyente' $condicion
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?