簡體   English   中英

合並來自同一mysql表的兩個選擇查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM