合并来自同一 MySQL 表的两个选择查询


combine two select queries from the same mysql table

我们有一个带有列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