2016-07-08 60 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