Ver Mensaje Individual
  #6 (permalink)  
Antiguo 10/12/2008, 17:57
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 ORDER BY

Por lo que parece, lo que quieres hacer es un ORDER BY condicional, al menos es lo que se desprende de esto:
Cita:
si su valor es 1 quiero que me lo ordene por los campos d1 y nombre, pero si su valor es 0 solo quiero ordenar por nombre.
El problema es que no existe un ORDER BY condicional, al menos en MySQL. Lo único que puedes hacer es definir un esquema de ordenamiento encadenado, esto es, primero por A, luego por B y luego por C. Pero lo que pretendes es que si A vale X se ordene por A, B y C, pero si A vale X+1 se ordene por B, A y C...
En esencia eso es imposible de hacer en un una sentencia, porque solamente puede haber un esquema de orden por cada SELECT.
Pero no es imposible de realizar... pero como no puedes hacer con ambos esquemas a la vez, porque afectará a todos los registros al mismo tiempo, entonces debes realizar dos SELECT que te devuelvan los conjuntos de cada valor, y luego ordenarlos todos.
Si observas atentamente tu propio ejemplo:

notarás que debes hacer un SELECT para obtener los d1=1 y destacado=1, luego otro para los d1=1 y destacado=0, y otro más para los otros.
El problema se da cuando quieras agruparlos, ya que un UNION, por default, los ordenará por el primer campo clave o por el primer campo del WHERE, además de eliminar los duplicados. Queda entonces solamente el UNION ALL.
Así bien, mi sugerencia práctica sería probar esto:
Código sql:
Ver original
  1. SELECT *
  2. FROM (
  3.    (SELECT id, titulo, imagen
  4.     FROM contenidos
  5.     WHERE d1=1 AND destacado = 1
  6.     ORDER BY destacado, d1, nombre ) T1
  7.    UNION ALL
  8.    (SELECT id, titulo, imagen
  9.     FROM contenidos
  10.     WHERE d1=1 AND destacado = 0
  11.     ORDER BY destacado, nombre, d1) T2
  12.    UNION ALL
  13.    (SELECT id, titulo, imagen
  14.     FROM contenidos
  15.     WHERE d1=0 AND destacado = 1
  16.     ORDER BY d1, nombre, destacado) T3
  17.    ) T4;

Esto es sólo un modelo. Ajusta los datos y testea cuál es la combinación correcta. No descartes el ejemplo a priori, ni lo tomes al pie de la letra. Prueba, y vuelve a probar... Sé que el modelo es funcional porque lo probé antes de ponerlo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 10/12/2008 a las 18:07