【问题标题】:combine two select queries from the same mysql table组合来自同一个 mysql 表的两个选择查询
【发布时间】:2016-11-10 17:55:31
【问题描述】:

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

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

我们只需将这两者结合到一个查询中。就是这样。

编辑: 其实我想通了。这很简单。

选择 id,membership_end 来自帐户 ORDER BY members_end >= NOW( ) DESC , id DESC

没有工会。没有复杂的查询:-)

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    您可以将空值排在第一位,这样就可以避免联合:

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

    【讨论】:

    • 您好,这不会显示membership_end 不为null 的用户(例如membership_end 为6/6/2016 的用户
    • 确实,这是您在问题中提供的查询:membership_end&gt;=now()。我只是想强调一下,您可以选择空值并对它们进行排序
    【解决方案2】:

    如果您不想重复,我建议您这样做。我不知道您想使用什么条件来过滤提交了 null members_end 的成员,但如果我愿意这样做:

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

    降序应该将具有 null members_end 的成员放在列表末尾,因此您可能需要添加额外的排序。

    【讨论】:

    • 不,请阅读以上内容。再次,您将那些会员资格过期的人排除在外。所以基本上第一个查询应该是将来有membership_end的那些,第二个应该是所有其他用户按id降序排序
    • @outlaw 我一直试图弄清楚为什么你需要一个联合一个小时 - 你应该编辑你的问题以包括'第二个应该是所有用户按降序排序的 id'
    【解决方案3】:

    试试这样的:

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

    这将结合 table1 和 table2

    重要的位是 table1 的 1 个字段和 table2 的 1 个字段。应该是一样的。

    【讨论】:

    • 不管是什么表..它可能已经完成了。即使只有一张桌子。只是解释你想要什么结果..这样我就可以帮助你..
    • @Draken 你的回答让我很困惑。该问题仅指示一个表,此处您的答案包含“table1”,“table2”。以及为什么 2 个 SELECT 查询的所有条件都是 'membership_end>=now()'。
    • 这不是我的答案@EkeymeMo,我只是对其进行了编辑以使其看起来更好。你需要与红军交谈
    • 这只是两个可能的查询可能组合的示例。不管是哪张桌子..
    • @reds 没关系。
    【解决方案4】:

    这里有两个技巧 1) 通过创建一个组合的日期 + id 字段将 id 与日期相关联,history 和 null 已被赋予未来的种子日期以避免与未来的日期成员重叠(您可能希望将其推出)2 ) 为联合语句分配一个源编号。

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

    【讨论】:

      猜你喜欢
      • 2013-11-22
      • 2013-01-16
      • 2012-02-18
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      相关资源
      最近更新 更多