根据到的条件排序基于有一些限制的两列


conditional order by to based on two columns with some limits

我被一个查询卡住了。。

我有一张广告表。在那里我有列sort_order和date_added.sort_order是根据组类型设置的。所以在我的页面上说,我想显示12个广告,由4组。

我想要3个广告,按日期排序,订单1在12月份的顶部。

然后,3个广告按date_added的dec顺序排列为2。

然后,3个广告的顺序为date_added的dec顺序的3。

然后,3个广告按date_added的dec顺序排列为4。

所以在前端,它应该看起来像这个

Name    date_added sort_order
ad1      12-2-2015   1
ad2      11-2-2015   1
ad3      10-2-2015   1
ad4      13-2-2015   2
ad5      12-2-2015   2
ad6      07-2-2015   2
ad7      18-2-2015   3
ad8      10-2-2015   3
ad9      03-2-2015   3
ad10      12-2-2015   4
ad11      08-2-2015   4
ad12      03-2-2015   4

如果sort_order=1只有2个广告,则sort_order=2可以显示4个广告。是否可以通过单个查询实现。请给个建议。

我正在尝试的是

Select name,sort_order,date_added form ads order by sort_order ASC,date_added DESC LIMIT 0,12

它没有跳水,每组的得分相等。

union all:最简单

select t.*
from ((Select name, sort_order, date_added 
       from ads
       where sort_order = 1
       order by date_added desc
       LIMIT 4
      ) union all
      (Select name, sort_order, date_added 
       from ads
       where sort_order = 2
       order by date_added desc
       LIMIT 4
      ) union all
      (Select name, sort_order, date_added 
       from ads
       where sort_order = 3
       order by date_added desc
       LIMIT 4
      ) union all
      (Select name, sort_order, date_added 
       from ads
       where sort_order = 4
       order by date_added desc
       LIMIT 4
      )
     ) t
order by sort_order, date_added desc;

然而,如果您想要12行,但可能没有中间行,那么这会变得更加困难。分配额外价值具有挑战性。这里有一种方法:

select s.*
from (select s.*,
             (@rn := if(@so = sort_order, @rn + 1,
                        if(@so := sort_order, 1, 1)
                       )
             ) seqnum
      from ads s cross join
           (select @rn := 0, @so := 0) vars
      order by sort_order, date_added desc
     ) s
where @rn <= 12
order by (case when @rn <= 4 then @rn else @rn + sort_order + 100 end)
limit 12;