Ver Mensaje Individual
  #2 (permalink)  
Antiguo 08/12/2009, 07:54
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: Seleccionar valor de una tabla u otra para ordenar

Cita:
Quiero poder sacar una lista de títulos de libros ordenados por título en un idioma específico, es decir, si la quiero ordenar por los títulos en Español, me ordene la tabla Books según los títulos (Books_titles.book_title) en español (title_lang = 'es'). Pero dado que no todos los libros en Books tienen un título traducido (es decir, no tienen entrada en Books_titles), si no hay entrada en Books_titles me tendría que coger para ordenar el campo Books.title.
El problema es resolver un criterio doble de ordenamiento, en uno de los cuales puede que jamás se pudiese ordenar, por cuanto el campo parece que puede presentarse como NULL, cosa que es inmanejable para un ordenamiento (¿cómo ordenas la nada?).
Sin embargo existe una posibilidad: Ordenar sobre la base de los valores dados en el SELECT con el uso de funciones. Esto permitiría establecer una jerarquía de ordenamiento: Primero se ordenarán los registros que tengan algo en books_titles , y luego lo que no tenga correspondencia en books. Esto implica que los datos deben tomarse en realidad de books como base y verificar si la correpondencia es NULL:
Esta sentencia:
Código sql:
Ver original
  1. SELECT
  2.   B.id,
  3.   B.title,
  4.   IF(BT.BT.title_lang IS NULL, B.title, BT.book_title) titulo
  5. FROM books B LEFT JOIN books_titles BT ON B.id = BT.book_id
  6. WHERE BT.title_lang IN ('fi') OR BT.title_lang IS NULL
  7. ORDER BY titulo;
Debería devolver una tabla ordenada por titulo, poniendo title, si no hay coincidencias (el cruce de dos tablas donde la relación no se cumple devuelve NULL en el campo usado de clave), o book_title, si hay.
El uso de IN() permite listar uno o más valores en el paréntesis. En este caso será "fi" o ninguno (""), que no es NULL.
Es posible que ciertas variaciones en el ordenamiento deban resolverse por un SP, o bien creando dinámicamente en la aplicación la sentencia conveneinte.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)