[英]Mysql order by multiple columns with conditions
例如,我有使用 Mysql 數據庫的應用程序和這種模式。
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'
我需要實現的是選擇所有廣告,但首先by packages.order asc, package_expire_at desc
訂購沒有過期的 package 然后訂購過期的按date desc
例如假設我們在 '2021-12-29' 那么結果應該是
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'
我在小提琴上添加了架構
在 (My)SQL 中執行此操作的方式是,您提供一個虛擬字段作為ORDER BY
條件。 像這樣的東西應該可以解決問題:
SELECT a.id
, a.date
, a.package_id
, a.package_expires_at
, IF( a.package_expires_at < CURRENT_DATE, 1, 0 ) AS is_expired
, IF( a.package_expires_at < CURRENT_DATE, a.`date`, a.`package_expires_at` ) AS sort_date
, p.`order` AS sort_package_order
FROM ads AS a
INNER JOIN packages AS p
ON p.id = a.package_id
ORDER BY IF( a.package_expires_at < CURRENT_DATE, 1, 0 ) ASC
, IF( a.package_expires_at < CURRENT_DATE, 1, p.`order` ) ASC
, IF( a.package_expires_at < CURRENT_DATE, a.`date`, a.`package_expires_at` ) DESC
使用兩個單獨的查詢,然后union
它們(你的包順序現在顛倒了它的 ID)
select * from (SELECT * from ads WHERE package_expires_at >= '2021-12-29' order by package_id asc, package_expires_at desc ) as a
union
select * from (SELECT * from ads WHERE package_expires_at < '2021-12-29' order by date desc) as b
如果它們是動態的並且沒有順序,請加入它們,然后執行上述操作。
select * from (SELECT ads.id,date,package_id,package_expires_at from ads left outer join packages on package_id = ads.id WHERE package_expires_at >= '2021-12-29' order by packages.order asc, package_expires_at desc ) as a
union
select * from ( SELECT ads.id,date,package_id,package_expires_at from ads left outer join packages on package_id = ads.id WHERE package_expires_at < '2021-12-29' order by date desc ) as b
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.