[ Foro de SQL (y MySQL) ]

Problema con orden en consulta

18-Oct-2018 16:16
Invitado (Max Cervera)
10 Respuestas

Tengo la siguiente consulta en la que asocio inmuebles con sus imágenes:

SELECT t.*,
                image_name,
                image_id
     FROM oak_inmo_sale t
     LEFT JOIN (SELECT * FROM oak_inmo_sale_image
                             ORDER BY image_date DESC) as oak_inmo_sale_image
                             ON t.inmo_sale_id=id_inmo_sale WHERE t.inmo_sale_high='1'
                                                                                                    AND t.inmo_sale_active='1'
GROUP BY id_inmo_sale

Funciona perfectamente salvo por el detalle de que no me devuelve la imagen con la fecha más reciente. Parece ser que la cláusula ORDER BY no hace lo que se supone que debería.

Es evidente que algo se me pasa por alto y agradecería cualquier ayuda para solucionarlo.


27-Oct-2018 23:52
Nacho Cabanes (+84)

¿El campo "image_date" es de fecha o de texto?  ¿En qué formato?


30-Oct-2018 10:01
Invitado (Max Cervera)

Hola Nacho.

El campo es de tipo int(8).
Dime si necesitas algún otro dato.

Y gracias por interesarte.


30-Oct-2018 13:27
Nacho Cabanes (+84)

¿Un entero largo, de 64 bits? No es lo habitual, porque tienes formatos específicos para fechas ¿Cómo haces para convertir la fecha a entero?  (¿y qué gestor de bases de datos utilizas?)


30-Oct-2018 16:44
Invitado (Max Cervera)

Es un Timestamp, ya sabes: segundos desde el 01/01/1970 00:00:00.
Y el gestor es MySQL.

Soy consciente de que hay otros formatos más funcionales según para qué tarea, pero el sistema sólo utiliza el dato, precisamente, para reordenar las imágenes de forma sencilla.
Es decir, en cada registro, tengo un script de Ajax que lo edita y actualiza el campo 'image_date' a la marca de tiempo actual, lo que le convierte en la imagen más reciente y, por lo tanto, en la primera a mostrar.


30-Oct-2018 17:32
Nacho Cabanes (+84)

Esperaría que un TIMESTAMP se ordenara correctamente. Como alternativa, puedes probar a convertirlo a fecha en formato AAAA-MM-DD con DATE_FORMAT, algo como:

DATE_FORMAT(FROM_UNIXTIME(campo), "%Y %m %d'))


30-Oct-2018 20:12
Invitado (Max Cervera)

Veamos:

He cambiado
'ORDER BY image_date DESC'
por
'ORDER BY DATE_FORMAT(FROM_UNIXTIME(image_date), "%Y %m %d") DESC'

Y el resultado es el mismo, sigue devolviéndome la imagen con el id más bajo, es decir, ordenado por la clave primaria.

Tengo la sospecha de que, aunque cambiara el tipo de campo a otro formato de fecha, seguiría comportándose de la misma manera.



30-Oct-2018 20:32
Invitado (Max Cervera)

He probado a cambiar el tipo de tabla de InnoDb a MyISAM, por si lo del orden por defecto, pero sigue devolviendo el mismo resultado.


30-Oct-2018 21:41
Nacho Cabanes (+84)

Hay un detalle importante que he dejado aparte pero que puede ser el motivo:

¿te refieres a la subconsulta o a la global?

Es raro si lo que no sale ordenado es el

SELECT * FROM oak_inmo_sale_image
                            ORDER BY image_date DESC

porque un Timestamp debería ser un criterio de ordenación válido.

Pero si te refieres a la consulta global... no tiene un ORDER BY, por lo que nada te garantiza un orden concreto.


31-Oct-2018 09:22
Invitado (Max Cervera)

En principio, el orden de la consulta global no debería ser relevante en este caso, sino el de la subconsulta, porque el objetivo es conseguir la imagen más reciente de cada elemento de la consulta global.

En todo caso, tu sugerencia me ha hecho replantear la consulta y, después de algunas pruebas, he observado esto:

El problema surge al aplicar la cláusula GROUP BY.
Me explico. En la siguiente consulta le pido únicamente un inmueble (id 121883):

SELECT t.*,
               image_name,
               image_id
    FROM oak_inmo_sale t
    LEFT JOIN (SELECT * FROM oak_inmo_sale_image
                            ORDER BY image_date DESC) as oak_inmo_sale_image
                            ON t.inmo_sale_id=id_inmo_sale WHERE t.inmo_sale_high='1'
                                                           AND t.inmo_sale_active='1'
                                                           AND t.inmo_sale_id=121883
ORDER BY oak_inmo_sale_image.image_date DESC      

Y devuelve un resultado con todas las imágenes de ese inmueble con la más reciente en primer lugar. Exactamente lo que cabe esperar.

Pero si a esa consulta le añado la cláusula GROUP BY de la siguiente manera:

...
GROUP BY t.inmo_sale_id
ORDER BY oak_inmo_sale_image.image_date DESC

el registro único que obtengo no incluye la imagen más reciente, sino la que tiene el id más bajo.

Lo que me lleva a pensar en que, independientemente de dónde intente aplicar el ORDER BY, al aplicar GROUP BY siempre obtengo el orden de la clave primaria más baja.

Extraño, pero real.


31-Oct-2018 11:15
Nacho Cabanes (+84)

Yo diría que el orden de la subconsulta no implica orden en la consulta global. Al no tener tus tablas (definición y datos de prueba) no puedo replicar el problema, como mucho crear un par de tablas "distintas a las tuyas" que muestren a lo que me refiero, pero yo añadiría un ORDER BY en la consulta global.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)