[英]combine two select queries from the same mysql table
我們有一個用戶表,其中有Membership_end列,顧名思義-用戶成員資格終止的日期。 現在,有些用戶從不購買會員資格,因此該字段為空。 對於某些用戶,該字段是過去的(成員資格已過期)。 我需要的是先對活動成員進行排序(按Membership_end date desc排序),然后按其他獨立的排序順序對其余用戶進行排序。 基本上,我們需要在頂部顯示活躍成員。
SELECT * FROM accounts where membership_end>=now()
order by membership_end desc
union
???
提前致謝
好吧,要清理一下。
SELECT * FROM accounts where membership_end>=now()
order by membership_end desc
給了我們12位活躍成員,這很好。 然后我們有這個:
SELECT * FROM accounts where membership_end<now()
order by id desc
我們只需要在一個查詢中將兩者結合即可。 就這樣。
編輯:其實我想通了。 這很簡單。
SELECT id,membership_end從帳戶開始ORDER BY BY Member_end> = NOW()DESC,id DESC
沒有工會。 沒有復雜的查詢:-)
您可以將空值排在第一位,因此可以避免使用並集:
SELECT membership_end FROM accounts
where membership_end>=now() or membership_end is null
ORDER BY [membership_end] IS NULL DESC, [membership_end] DESC
如果您不想重復,我建議您這樣做。 我不知道您要使用什么條件來過濾成員為空的membership_end的成員,但是如果我要這樣做的話:
SELECT membership_end FROM accounts where membership_end>=now() or membership_end is null order by membership_end desc
降序排序應將具有空membership_end的成員放在列表的末尾,因此您可能要添加其他排序。
嘗試這樣的事情:
SELECT membership_end FROM table1 where membership_end>=now()
Union all
SELECT membership_end FROM table2 where membership_end>=now()
這將結合table1和table2
重要的位是表1的1個字段和表2的1個字段。 必須相同。
這里有兩個竅門:1)通過創建組合的日期+ id字段將id與日期相關聯,為將來的歷史和空值提供了種子日期,以避免與將來標有日期的成員重疊(您可能希望將其淘汰)2)分配一個存儲到聯合語句的序號。
/*
create table m (id int, enddte date);
truncate table m;
insert into m values
(1,null),(2,'2016-10-01'),(3,'2016-11-10'),(4,'2016-02-01'),(5,'2016-03-01'),(6,null);
*/
select * from
(
select 1 as srce,m.id,m.enddte ,
year(m.enddte) * 10000 + month(m.enddte) * 100 + m.id as uniqueid
from m
where m.enddte >= now()
) s
union
(
select 2,id,enddte,
year(cast('2050-01-01' as date)) * 10000 + month(cast('2050-01-01' as date)) * 100 + id
from m
where m.enddte < now() or m.enddte is null
)
order by srce,uniqueid desc
或者你可以在沒有工會的情況下做到這一點
select * from
(
select case
when enddte >= now() then 1
else 2
end as srce,
id, enddte,
case
when enddte >= now() then year(m.enddte) * 10000 + month(m.enddte) * 100 + m.id
else year(cast('2050-01-01' as date)) * 10000 + month(cast('2050-01-01' as date)) * 100 + id
end as uniqueid
from m
) s order by srce,uniqueid desc
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.