我被一个查询卡住了。。
我有一张广告表。在那里我有列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;