Hola ManelGomez:
Qué es lo que quieres saber??? o cual es la duda??? comentar acerca de si está bien o está mal es un poco difícil, por lo pronto te hago algunas observaciones:
Código:
SELECT p.id AS did, p.*, g.nombre AS generonombre,
Si estás poniendo p.* indicas que vas a traer TODOS LOS CAMPOS DE LA TABLA P, entonces no tienes necesidad de listar el campo p.id, tal como lo tienes se duplicaría este campo. La palabra reservada AS podrías quitarla sin ningún problema.
Código:
CASE WHEN CHAR_LENGTH(p.alias) THEN
CONCAT_WS(\':\', p.id, p.alias)
ELSE p.id END
Este CASE-WHEN en realidad no sé para qué lo hace, la función CHAR_LENGH regresa una longitud, no un booleano (TRUE, FALSE) pero lo que hace es determinar si muestra solo el ID o la concatenación del ID y el alias.
El resto no tiene nada que explicarse, es simplemente un LEFT JOIN entre las tablas.
Saludos
Leo.