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

[SOLUCIONADO] Order by

Estas en el tema de Order by en el foro de Mysql en Foros del Web. Tengo una tabla de documentos con la columna FOLIO. Son varios renglones, en el campo FOLIO lo siguiente: 1 5 0 3 0 Con ORDER ...
  #1 (permalink)  
Antiguo 09/03/2013, 13:14
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 10 meses
Puntos: 21
Order by

Tengo una tabla de documentos con la columna FOLIO.
Son varios renglones, en el campo FOLIO lo siguiente:

1
5
0
3
0

Con ORDER BY folio DESC me los ordena así:

5
3
1
0
0

Deseo primero mostrar los ceros 0 y luego los que tienen folio > 0, de tal forma que sean mostrados así:

0
0
5
3
1

¿Como sería esta instrucción? ¿donde puedo consultar acerca de combinar esta instrucción?

Gracias
  #2 (permalink)  
Antiguo 09/03/2013, 13:43
Avatar de 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

Dos consultas. La primera buscando sólo los ceros, y la segunda el resto, ambas unidas con UNION ALL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 09/03/2013, 13:47
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 10 meses
Puntos: 21
Respuesta: Order by

Así lo tengo con UNION ALL, imaginé podría existir algo más simple.
Muchas gracias.
  #4 (permalink)  
Antiguo 09/03/2013, 13:49
Avatar de 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

Más "simple" implicaría menos performance, aunque no lo creas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 09/03/2013, 13:50
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 10 meses
Puntos: 21
Respuesta: Order by

Intentaré hacer un cambio al UNION ALL, preguntaré una vez que haga unas pruebas.
Gracias de nuevo
  #6 (permalink)  
Antiguo 09/03/2013, 14:22
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 10 meses
Puntos: 21
Respuesta: Order by

Debo tener un error de concepto y por más pruebas no me funciona.
El problema lo tengo con ORDER BY

Mi instruccion completa es:

Código MySQL:
Ver original
  1.     d.llave, cy.rfc, d.fecha, d.folio, c.nombre, d.subtotal,
  2.     d.iva, d.isr, d.iva2, d.cancelado
  3.     $tabla d
  4.     LEFT JOIN cbb_contribuyentes cy on cy.llave=d.contribuyente
  5.     LEFT JOIN cbb_clientes c on c.llave=d.cliente
  6.     (c.usuario = '$k_usuario'
  7.     AND cy.llave = '$contribuyente'
  8.     AND YEAR(d.fecha) = '$ano'
  9.     AND MONTH(d.fecha) = '$mesx'
  10.     $condicion
  11.     AND d.folio = 0
  12.     )
  13.     d2.llave, cy2.rfc, d2.fecha, d2.folio, c2.nombre, d2.subtotal,
  14.     d2.iva, d2.isr, d2.iva2, d2.cancelado
  15. FROM $tabla d2
  16.     LEFT JOIN cbb_contribuyentes cy2 on cy2.llave=d2.contribuyente
  17.     LEFT JOIN cbb_clientes c2 on c2.llave=d2.cliente
  18.     WHERE
  19.     (c2.usuario = '$k_usuario'
  20.     AND cy2.llave = '$contribuyente'
  21.     AND YEAR(d2.fecha) = '$ano'
  22.     AND MONTH(d2.fecha) = '$mesx'
  23.     $condicion
  24.     )
  25.     AND d2.folio <> 0
  26. ORDER BY d2.folio ASC)

El asunto es que no me genera el resultado ordenado de acuerdo a folio, de la segunda parte, cuando folio <> 0
Me marcaba error al incluir ORDER BY, lo cual resolví "encerrando" entre parentesis (...) cada una de las dos partes, y dejando el ORDER BY dentro del segundo paréntesis. Ya no marca error, y si muestra todo, solo que no me lo muestra ordenado.
Posteriormente agregué el 2 a cada tabla y a cada campo de la segunda instrucción, y también muestra todo, solo que sigue sin ordenarme el resultado.

¿alguna sugerencia?

Gracias

Última edición por gnzsoloyo; 09/03/2013 a las 14:36 Razón: Codigo de programacion no permitido.
  #7 (permalink)  
Antiguo 09/03/2013, 14:30
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 10 meses
Puntos: 21
Respuesta: Order by

Pregunta:

Saqué el ORDER BY fuera de los parentesis:

Código MySQL:
Ver original
  1. (SELECT d.llave, cy.rfc, d.fecha, d.folio, c.nombre, d.subtotal,
  2.      d.iva, d.isr, d.iva2, d.cancelado
  3. FROM $tabla d
  4.      LEFT JOIN cbb_contribuyentes cy on cy.llave=d.contribuyente
  5.      LEFT JOIN cbb_clientes c on c.llave=d.cliente
  6. WHERE (c.usuario = '$k_usuario' AND cy.llave = '$contribuyente'
  7.      AND YEAR(d.fecha) = '$ano' AND MONTH(d.fecha) = '$mesx'
  8.      $condicion) AND d.folio = 0)
  9. (SELECT d.llave, cy.rfc, d.fecha, d.folio, c.nombre, d.subtotal,
  10.      d.iva, d.isr, d.iva2, d.cancelado
  11. FROM $tabla d
  12.      LEFT JOIN cbb_contribuyentes cy on cy.llave=d.contribuyente
  13.      LEFT JOIN cbb_clientes c on c.llave=d.cliente
  14. WHERE (c.usuario = '$k_usuario' AND cy.llave = '$contribuyente'
  15.      AND YEAR(d.fecha) = '$ano' AND MONTH(d.fecha) = '$mesx'
  16.      $condicion) AND d.folio <> 0
  17.      )
y así si me ordena, pero toda la consulta, y deseo solo ordenar el segundo grupo.
Será posible hacer lo que requiero con una sola instruccion de MYSQ como lo estoy intentando?
haciendolo en dos partes lo resuelvo, pero intentaría saber si es posible ordenar solo el segundo grupo.

Gracias

Última edición por gnzsoloyo; 09/03/2013 a las 14:49 Razón: Código de programacion no permitido en BBDD.
  #8 (permalink)  
Antiguo 09/03/2013, 14:33
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 10 meses
Puntos: 21
Respuesta: Order by

Veo el siguiente ejemplo:
http://stackoverflow.com/questions/4...-all-and-limit

Código MySQL:
Ver original
  1. (SELECT a FROM t1 WHERE a=10 AND B=1)
  2. (SELECT a FROM t2 WHERE a=11 AND B=2)
  3. (SELECT a FROM t3 WHERE a=12 AND B=3)
  4. ORDER BY a LIMIT 1000;

el cual ordena la totalidad de registros
¿es posible: ordenar el primer grupo en ASC, el segundo en DESC y el tercero en ASC?

Gracias
  #9 (permalink)  
Antiguo 09/03/2013, 14:45
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 10 meses
Puntos: 21
Respuesta: Order by

Ya tengo aclarado el dilema, por si a alguien le hace falta posteriormente.
Incluso por aquí se trató el tema: http://www.forosdelweb.com/f86/union...-order-676606/

La solución se encuentra aquí:
http://dev.mysql.com/doc/refman/5.0/es/union.html

Se resuelve con solo agregar LIMIT, es por motivos de optimización, es decir así:

Código MySQL:
Ver original
  1. (SELECT a FROM tbl_name WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
  2. (SELECT a FROM tbl_name WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

Gracias
  #10 (permalink)  
Antiguo 09/03/2013, 14:46
Avatar de 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)
  #11 (permalink)  
Antiguo 09/03/2013, 14:50
Avatar de 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

Un detalle: Acuérdate que estás en el foro de MySQL. No postees nada del PHP, separa la consulta y usa el Highlight correcto.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 09/03/2013, 14:58
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 10 meses
Puntos: 21
Respuesta: Order by

Gracias por tus comentarios.

Respecto a:
- 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.

En este caso, $condiciones es una serie de intrucciones que funcionan perfecto. Para formular mi planteamiento, la inicialicé $condiciones = "" a fin de no dar otras ideas que no venían al caso.
El utilizar estas variables me ofrecen mucho control de mi proyecto, ya que las instrucciones MySQL las genero de acuerdo a las necesidades cada vez.

- 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 ()

Gracias por la recomendación, por ello puse en donde lo encontré, y tienes razón, en el manual venía la respuesta.
http://dev.mysql.com/doc/refman/5.0/es/union.html

Muchas gracias nuevamente, muy agradecido por tu valiosa ayuda.

Etiquetas: campo, order, tabla
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 12:43.