结合来自同一个mysql表

时间:2016-07-08 08:16:54

标签: php mysql

我们有一个列为membership_end的用户表,顾名思义就是用户成员资格结束的日期。现在有些用户从不购买会员资格,因此该字段为空。对于某些用户,该字段是过去的(成员资格已过期)。 我需要的是首先对活动成员进行排序(按membership_end日期desc排序),然后按照某种独立排序顺序对其余用户进行排序。基本上我们需要在活跃的会员身上显示出来。

SELECT * FROM accounts where membership_end>=now() 
order by membership_end desc
union
???
  • 我们应该使用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 membership_end&gt; = NOW()DESC,id DESC

没有工会。没有复杂的问题: - )

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果您不想要重复,我建议您这样做。我不知道你想用什么条件来过滤成员资格为null的成员资格,但是如果所有我会这样做的话:

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

降序排序应该将具有null membership_end的成员放在列表的末尾,这样你可能想要添加额外的排序。

答案 2 :(得分:0)

尝试这样的事情:

.md-virtual-repeat-container.md-orient-vertical {
    height: calc(100% - 100px);
}

这将结合table1和table2

重要的位是table1的1个字段和table2的1个字段。它必须是一样的。

答案 3 :(得分:0)

这里有两个技巧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