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
davy.ai
Para obtener el resultado deseado, puedes utilizar la siguiente consulta SQL:
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 elLEFT 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.