es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ordenar por múltiples columnas en MySQL con condiciones.

Tengo una aplicación que utiliza una base de datos Mysql con este esquema, por ejemplo.

packages
id, name, order
1, ‘Free’, 3
2, ‘Basic’, 2
3, ‘Extensive’, 1

ads
id, date, package_id, package_expires_at
1, ‘2021-12-10 00:00:00’, 1, ‘2022-01-10’
2, ‘2021-12-15 00:00:00’, 3, ‘2021-12-28’
3, ‘2021-12-15 00:00:00’, 3, ‘2022-01-10’
4, ‘2021-12-20 00:00:00’, 2, ‘2022-01-10’
5, ‘2021-12-21 00:00:00’, 1, ‘2021-12-28’
6, ‘2021-12-25 00:00:00’, 1, ‘2021-12-28’

Lo que necesito lograr es seleccionar todos los anuncios, pero ordenar los paquetes no vencidos primero por “packages.order asc, package_expire_at desc”, y luego ordenar los vencidos por “date desc”.

Por ejemplo, supongamos que estamos en ‘2021-12-29’, entonces el resultado debería ser:

id, date, package_id, package_expires_at
3, ‘2021-12-15 00:00:00’, 3, ‘2022-01-10’
4, ‘2021-12-20 00:00:00’, 2, ‘2022-01-10’
1, ‘2021-12-10 00:00:00’, 1, ‘2022-01-10’
6, ‘2021-12-25 00:00:00’, 1, ‘2021-12-28’
5, ‘2021-12-21 00:00:00’, 1, ‘2021-12-28’
2, ‘2021-12-15 00:00:00’, 3, ‘2021-12-28’

He agregado el esquema en Fiddle:

http://sqlfiddle.com/#!9/cedb45/9

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener el resultado deseado, puedes utilizar la siguiente consulta SQL:

    SELECT ads.id, ads.date, ads.package_id, ads.package_expires_at
    FROM ads
    LEFT JOIN packages ON ads.package_id = packages.id
    ORDER BY 
        CASE WHEN ads.package_expires_at > '2021-12-29' THEN packages.order END ASC,
        ads.package_expires_at DESC,
        ads.date DESC;
    

    Esta consulta primero aplica un orden condicional basado en la fecha de vencimiento del paquete, ordenando primero los paquetes no vencidos según su orden de paquete. El segundo nivel de ordenamiento se basa en la fecha de vencimiento en sí, donde las fechas más lejanas se colocan primero. Finalmente, los anuncios se ordenan por fecha, con los anuncios más recientes en primer lugar.

    Ten en cuenta que esta consulta asume que la fecha actual es '2021-12-29'. Si quieres usar una fecha diferente, debes reemplazar el valor codificado en la consulta en consecuencia. Además, ten en cuenta que el LEFT JOIN puede devolver valores NULL para los anuncios que no tienen un paquete correspondiente, por lo que es posible que desees ajustar la consulta según tus necesidades.

Comments are closed.