我们有一个带有列membership_end的用户表,顾名思义,这是用户成员资格结束的日期。现在,有些用户从不购买会员资格,因此该字段为空。对于某些用户,该字段是过去的字段(成员资格已过期)。我需要的是首先对活动成员进行排序(按membership_end日期排序),然后按某种独立的排序顺序对其余用户进行排序。基本上,我们需要在顶部显示活动成员。
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
我们只需要将这两者组合在一个查询中。仅此而已。
编辑:其实我想通了。这很简单。
选择标识,membership_end从帐户排序方式 membership_end>= NOW( ) 描述 , ID 描述
没有工会。 没有复杂的查询:-)
您可以将空值排序为第一个,这样就可以避免并集:
SELECT membership_end FROM accounts
where membership_end>=now() or membership_end is null
ORDER BY [membership_end] IS NULL DESC, [membership_end] DESC
如果您不想要重复项,我建议您这样做。我不知道您想使用什么条件来过滤具有 null 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()
这将合并表 1 和表 2
重要位是表 1 的 1 个字段和表 2 的 1 个字段。它必须是一样的。
这里有两个技巧 1) 通过创建组合的日期 + id 字段将 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