基于具有一些限制的两列的条件顺序

时间:2015-02-13 12:33:30

标签: php mysql

我被困在查询中..

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

我希望3个广告按照date_added的顺序在顶部按顺序排列1。

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

然后,3个广告按照date_added的顺序排列顺序3。

然后,3个广告按照date_added的顺序排列顺序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

对于每个小组来说,不潜水导致相同的部分。

1 个答案:

答案 0 :(得分:1)

这对于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;