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

¿ Hacer un SELECT listando primero los valores superiores a cero ?

Estas en el tema de ¿ Hacer un SELECT listando primero los valores superiores a cero ? en el foro de Mysql en Foros del Web. Hola a todos, Tengo una serie de registros cada uno con un número de 0 a 9. En una misma sentencia SELECT deseo visualizar (con ...
  #1 (permalink)  
Antiguo 11/11/2013, 11:24
 
Fecha de Ingreso: octubre-2003
Ubicación: España
Mensajes: 1.067
Antigüedad: 20 años, 5 meses
Puntos: 18
¿ Hacer un SELECT listando primero los valores superiores a cero ?

Hola a todos,

Tengo una serie de registros cada uno con un número de 0 a 9.

En una misma sentencia SELECT deseo visualizar (con ORDER BY) primero los registros superiores a 0 y después los que tienen valor 0

¿ Como lo podría realizar ?

Saludos!!
  #2 (permalink)  
Antiguo 11/11/2013, 11:42
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: ¿ Hacer un SELECT listando primero los valores superiores a cero ?

Haciendo un UNION con las condiciones del WHERE adecuadas. Es decir, el primer SELECT lso valores de 1 a 9, y el segundo SELECT después del UNION ALL, buscando sólo los que tengan 0.
Es lo más sencillo que se puede plantear.
Código SQL:
Ver original
  1. SELECT * FROM
  2.     (SELECT ...
  3.     FROM tabla
  4.     WHERE columna >0
  5.     ORDER BY ....) T1
  6. UNION ALL
  7. SELECT * FROM
  8.     (SELECT ...
  9.     FROM tabla
  10.     WHERE columna =0
  11.     ORDER BY ....) T2
__________________
¿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 11/11/2013, 11:57
 
Fecha de Ingreso: octubre-2003
Ubicación: España
Mensajes: 1.067
Antigüedad: 20 años, 5 meses
Puntos: 18
Respuesta: ¿ Hacer un SELECT listando primero los valores superiores a cero ?

Hola gnzsoloyo,

Yo lo tengo puesto así:
Código MySQL:
Ver original
  1. (SELECT familias.*, categorias.* FROM familias, categorias
  2.       WHERE familias.categoria_id = categorias.id_categoria
  3.           AND familias.categoria_id = $id_categoria
  4.           AND familias.familia_num_orden > 0
  5.       ORDER BY familias.familia_num_orden ASC)
  6.       (SELECT familias.*, categorias.* FROM familias, categorias
  7.         WHERE familias.categoria_id = categorias.id_categoria
  8.             AND familias.categoria_id = $id_categoria
  9.             AND familias.familia_num_orden < 1
  10.          ORDER BY familias.familia_num_orden ASC)
A pesar de que efectivamente primero me muestra los valores superiores a 0 y después el resto, no me los ordena de menor a mayor si no al revés.

¿Que hago mal ?

;)

Última edición por gnzsoloyo; 11/11/2013 a las 12:30
  #4 (permalink)  
Antiguo 11/11/2013, 12:15
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: ¿ Hacer un SELECT listando primero los valores superiores a cero ?

Yo no usaría el asterisco, sino los nombres de los campos de las tablas familias y categorías, en el mismo orden. Yo usaría INNER JOIN para relacionar las tablas. Y ordenaría al final por esos campos a los que he añadido alias.
Código MySQL:
Ver original
  1. (SELECT familias.*, categorias.*, '0' crit1orden, familia_num_orden crit2orden FROM familias INNER JOIN categorias
  2. ON familias.categoria_id = categorias.id_categoria
  3. AND familias.categoria_id = $id_categoria
  4. AND familias.familia_num_orden > 0)
  5. (SELECT familias.*, categorias.*, '1' crit1orden, familia_num_orden crit2orden FROM familias INNER JOIN categorias
  6. WHERE familias.categoria_id = categorias.id_categoria
  7. AND familias.categoria_id = $id_categoria
  8. AND familias.familia_num_orden < 1)  ORDER BY crit1orden, crit2orden

Prueba y nos dices
  #5 (permalink)  
Antiguo 11/11/2013, 13:28
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: ¿ Hacer un SELECT listando primero los valores superiores a cero ?

Hola davidj:

Creo que podrías hacerlo más simple, con un IF en el ORDER BY, si entendí correctamente lo que quieres hacer sería así:

Código MySQL:
Ver original
  1. mysql> SELECT id, descripcion FROM tabla;
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    0 | cero        |
  6. |    1 | uno         |
  7. |    2 | dos         |
  8. |    3 | tres        |
  9. |    4 | cuatro      |
  10. |    5 | cinco       |
  11. +------+-------------+
  12. 6 rows in set (0.00 sec)
  13.  
  14. mysql> SELECT id, descripcion FROM tabla ORDER BY IF(id = 0, 2, 1), id;
  15. +------+-------------+
  16. | id   | descripcion |
  17. +------+-------------+
  18. |    1 | uno         |
  19. |    2 | dos         |
  20. |    3 | tres        |
  21. |    4 | cuatro      |
  22. |    5 | cinco       |
  23. |    0 | cero        |
  24. +------+-------------+
  25. 6 rows in set (0.00 sec)

Haz la prueba y nos comentas.

Saludos
Leo.
  #6 (permalink)  
Antiguo 11/11/2013, 13:53
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: ¿ Hacer un SELECT listando primero los valores superiores a cero ?

y si funcionan las dos, amigos técnicos, estaría bien saber cuál es más eficiente y por qué
  #7 (permalink)  
Antiguo 12/11/2013, 05:43
 
Fecha de Ingreso: octubre-2003
Ubicación: España
Mensajes: 1.067
Antigüedad: 20 años, 5 meses
Puntos: 18
Respuesta: ¿ Hacer un SELECT listando primero los valores superiores a cero ?

Cita:
Iniciado por leonardo_josue Ver Mensaje
Hola davidj:

Creo que podrías hacerlo más simple, con un IF en el ORDER BY, si entendí correctamente lo que quieres hacer sería así:

Código MySQL:
Ver original
  1. mysql> SELECT id, descripcion FROM tabla;
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    0 | cero        |
  6. |    1 | uno         |
  7. |    2 | dos         |
  8. |    3 | tres        |
  9. |    4 | cuatro      |
  10. |    5 | cinco       |
  11. +------+-------------+
  12. 6 rows in set (0.00 sec)
  13.  
  14. mysql> SELECT id, descripcion FROM tabla ORDER BY IF(id = 0, 2, 1), id;
  15. +------+-------------+
  16. | id   | descripcion |
  17. +------+-------------+
  18. |    1 | uno         |
  19. |    2 | dos         |
  20. |    3 | tres        |
  21. |    4 | cuatro      |
  22. |    5 | cinco       |
  23. |    0 | cero        |
  24. +------+-------------+
  25. 6 rows in set (0.00 sec)

Haz la prueba y nos comentas.

Saludos
Leo.

Parece que funciona perfecto !! y con poca sintaxis....

Pero no se exactamente que significa ORDER BY IF(id = 0, 2, 1), id
¿ Me lo podrías explicar?

Mil gracias a ti y a todos los que responden !!
  #8 (permalink)  
Antiguo 12/11/2013, 11:10
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: ¿ Hacer un SELECT listando primero los valores superiores a cero ?

Hola davidj:

Para saber cómo funciona el if condicional, puedes colocarlo en el SELECT, checa este ejemplo:

Código MySQL:
Ver original
  1. mysql> SELECT id, descripcion FROM tabla;
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    0 | cero        |
  6. |    1 | uno         |
  7. |    2 | dos         |
  8. |    0 | otro cero   |
  9. |    0 | uno más     |
  10. |    3 | tres        |
  11. +------+-------------+
  12. 6 rows in set (0.00 sec)
  13.  
  14. mysql> SELECT id, descripcion, IF(id = 0, 2, 1) orden FROM tabla;
  15. +------+-------------+-------+
  16. | id   | descripcion | orden |
  17. +------+-------------+-------+
  18. |    0 | cero        |     2 |
  19. |    1 | uno         |     1 |
  20. |    2 | dos         |     1 |
  21. |    0 | otro cero   |     2 |
  22. |    0 | uno más     |     2 |
  23. |    3 | tres        |     1 |
  24. +------+-------------+-------+
  25. 6 rows in set (0.00 sec)

Lo que hace el IF es "clasificar" los registros de acuerdo al valor del ID, en el ejemplo se crea una nueva columna llamada "ORDEN" donde observas qué es lo que pasa...

Código:
IF(id = 0, 2, 1)
el IF asigna dos valores posibles: 2 cuando el ID es igual a cero y 1 cuando es distinto... esto sirve para colocar entonces primero los id's distintos de cero y al final los valores iguales a cero... al poner esto:

Código:
...
ORDER BY IF(id = 0, 2, 1), id
lo que indicas es que el primer criterio para ordenar es esta clasificación arbitraria, por eso coloca primero todos los 1's y luego todos los 2's... el segundo criterio es el id en si...

Espero que con esto te quede un poco más claro la lógica de la consulta

Saludos
Leo.

Etiquetas: cero, primero, registro, select
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 16:25.