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 originalSELECT
B.id,
B.title,
IF(BT.BT.title_lang IS NULL, B.title, BT.book_title) titulo
FROM books B LEFT JOIN books_titles BT ON B.id = BT.book_id
WHERE BT.title_lang IN ('fi') OR BT.title_lang IS NULL
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.