我被困在查询中..
我有一个广告表。我有列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
对于每个小组来说,不潜水导致相同的部分。
答案 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;