Comunidad de diseño web y desarrollo en internet online

JOIN + DISTINCT o GROUP BY

Citar            
MensajeEscrito el 14 Nov 2008 04:50 pm
Hola,

tengo una base de datos con apartamentos e imágenes para cada apartamento. Cada apartamento puede tener una, varias o ninguna imagen, y cada imagen puede estar desactivada o activada (g.active), destacada o no (g.highlighted), además de tener un número de orden (1ª, 2ª, 3ª) relativo al resto de las imágenes del mismo apartamento.

Quiero que mi consulta me devuelva todos los apartamentos que tengo activos en la base de datos, y para cada uno de ellos una imagen, si la tiene. Después de darle bastantes vueltas, he conseguido la siguiente consulta:

Código :

SELECT a.id_apartment, al.title, al.description, al.features, 
if(g.active = "1", g.image, NULL) AS image 
FROM apartments AS a INNER JOIN apartments_lang AS al ON a.id_apartment = al.rl_apartment 
LEFT JOIN gallery_relations AS gr ON a.id_apartment = gr.rl_id 
LEFT JOIN gallery AS g ON gr.rl_gallery = g.id_gallery 
WHERE al.language = "es" 
AND a.site = "ceama"
AND a.active = "1" 
AND (gr.section = "apartments" OR gr.section IS NULL) 
GROUP BY a.id_apartment 
ORDER BY a.sort ASC, g.sort ASC LIMIT 0, 5


La consulta me devuelve correctamente todos los apartamentos, y una imagen para cada apartamento. El problema está en que también me gustaría que, de entre las imágenes asociadas al apartamento, me devolviera preferentemente la que tenga un número de orden más bajo, lo intento hacer utilizando el ORDER BY g.sort ASC, pero no me devuelve el resultado esperado. ¿Qué hago mal? ¿Cómo puedo conseguir dicho resultado?

Gracias y un saludo.

Por akhasis

75 de clabLevel



 

firefox
Citar            
MensajeEscrito el 14 Nov 2008 06:11 pm
crea una sub consulta en el select

Código :

SELECT 
a.campo1,
a.campo2,
( SELECT 
      g.img 
   FROM gallery g 
   WHERE g.id= xx ORDER BY g.algo
) img # <- otra forma de usar alias
FROM tabla1 a 
# etc... 

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

firefox
Citar            
MensajeEscrito el 14 Nov 2008 07:35 pm
Gracias por tu solución, pero prefiria hacerlo de alguna manera que no tuviera que anidar consultas. Pillé manía a esto de anidar consultas cuando empecé a trabajar haciendo webs, y me di cuenta cuando ya tenia terminada una pagina muy grande de que el mysql del servidor no soportaba consultas anidadas, por lo que tuve que rehacer la página entera.

De todas maneras, aún utilizando la solucion con consultas anidadas, me gustaría saber si hay alguna forma de hacerlo con un solo SELECT, por curiosidad y como ejercicio.

Gracias de nuevo y un saludo.

Por akhasis

75 de clabLevel



 

firefox
Citar            
MensajeEscrito el 14 Nov 2008 08:11 pm
errr...

yo uso mysql y si soporta este tipo de consultas

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.