2016-07-08 58 views
2

我們有一個用戶列表membership_end,正如名稱所示 - 用戶成員資格結束的日期。現在有些用戶從不購買會員資格,因此該字段爲空。對於某些用戶,該字段已過期(成員已過期)。 我需要的是首先對活動成員進行排序(按membership_end date desc排序),然後按其他獨立排序順序對其餘用戶進行排序。基本上我們需要展示活躍的成員。結合了來自同一個mysql表的兩個選擇查詢

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標識,membership_end FROM帳戶 ORDER BY membership_end> = NOW()DESC,ID DESC

沒有聯合。 :-)

回答

0

沒有複雜的查詢可以空值是第一個,排序,所以你能避免工會:

SELECT membership_end FROM accounts 
where membership_end>=now() or membership_end is null 
ORDER BY [membership_end] IS NULL DESC, [membership_end] DESC 
+0

您好,不會向用戶展示其membership_end不爲空(例如那些membership_end是2016年6月6日 – Outlaw011

+0

事實上,是你在以下問題中提供的查詢:'membership_end> = now()'我只是想強調你可以選擇空值並對它們進行排序 –

0

如果你不想重複我建議這樣做。我不知道你要使用過濾與空membership_end成員提起什麼條件,但如果一切我都在做這樣的事情:

SELECT membership_end FROM accounts where membership_end>=now() or membership_end is null order by membership_end desc 

降序排列應該把成員空membership_end在列表的末尾,所以你可能想要添加額外的順序。

+0

nah,請再閱讀上面的內容。 basibally第一個查詢應該是那些membership_end在未來,第二個應該是所有其他用戶按降序id排序 – Outlaw011

+0

@outlaw我一直在試圖弄清楚爲什麼你需要一個小時的工會 - 你應該編輯你的問題,包括'第二個應該是所有用戶按降序編號順序' –

0

嘗試這樣:

SELECT membership_end FROM table1 where membership_end>=now() 
Union all 
SELECT membership_end FROM table2 where membership_end>=now() 

本文將結合表1和表2

最重要的一點是表1 1場僅1個表2場。它一定是一樣的。

+0

thx,但我們結合從同一張表.. – Outlaw011

+0

不管它是什麼表..它可能完成。即使只有一張桌子。只是解釋你想成爲什麼樣的結果..所以我可以幫你.. –

+0

編輯了這個問題。請檢查 – Outlaw011

0

這裏有兩個技巧1)通過創建一個組合的日期+ ID字段將日期與日期關聯起來,歷史和空值在未來被賦予一個種子日期以避免與將來有日期的成員重疊(您可能希望推出該日期) 2)爲聯合聲明分配一個srce號碼。

/* 
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