如何对查询进行分组并随机获取每个组的第n个项目

时间:2016-04-22 06:30:31

标签: mysql arraylist silverstripe

我有一张桌子Bildergalerie。每条记录都有一个对应的页面(PageID)。如何循环遍历表并按每个PageID(分组?)随机查询4条记录并将结果传递给模板?

**ID ClassName PageID**
1 Bildergalerie **8**
2 Bildergalerie **12**
3 Bildergalerie 13
4 Bildergalerie 13
5 Bildergalerie 13
6 Bildergalerie 13
7 Bildergalerie 13
8 Bildergalerie 13
9 Bildergalerie 13
10 Bildergalerie 13
11 Bildergalerie 8
12 Bildergalerie 8
13 Bildergalerie 12
14 Bildergalerie 12
15 Bildergalerie 12
16 Bildergalerie 12
17 Bildergalerie 12
18 Bildergalerie 12
19 Bildergalerie 12
20 Bildergalerie 12
21 Bildergalerie 12
22 Bildergalerie 12
23 Bildergalerie 12
24 Bildergalerie 12
25 Bildergalerie 12

希望有人可以提供帮助。 THX: - )

目前我在控制器中使用以下功能

public function getBildergalerieninner() { 
    $Testimonials = Bildergalerie::get()->sort('RAND()')->limit(12);
    return $Testimonials;
}    

在模板中我使用此循环

<% loop Bildergalerieninner %>
    <div class="grids col-xs-12 col-sm-4 col-md-3 mix all $Page.URLSegment">
        <div class="grid">
            <img src="$Bildergalerie.BildergalerieThumb.URL" width="400" height="273" alt="$Alttext" class="img-responsive" />
            <div class="figcaption">
            <h4>$Alttext</h4>
            <a href="$Bildergalerie.BildergalerieBig.URL" data-rel="prettyPhoto[portfolio]">
                <i class="fa fa-search"></i>
            </a> 
            <% if VerlinkungID %>
            <a href="$Verlinkung.Link">
                <i class="fa fa-link"></i>
            </a>
            <% end_if %>
        </div>
    </div>
</div>
<% end_loop %>  

我尝试做的是每个PageID随机获取Bildergalerie项目?

我已经查看了其他问题,但没有找到答案或方法来找到正确的方向?!

2 个答案:

答案 0 :(得分:1)

您可以使用带有Silverstripe的GroupedList轻松管理它:

public function GroupedEntries() {
        return GroupedList::create(
            Bildergalerie::get()->sort('RAND()')
        );
}

<% loop $GroupedEntries.GroupedBy('PageID') %>
<% loop $Children.Limit(4) %>
<div class="grids col-xs-12 col-sm-4 col-md-3 mix all $Page.URLSegment">
    <div class="grid">
        <img src="$Bildergalerie.BildergalerieThumb.URL" width="400" height="273" alt="$Alttext" class="img-responsive" />
        <div class="figcaption">
        <h4>$Alttext</h4>
        <a href="$Bildergalerie.BildergalerieBig.URL" data-rel="prettyPhoto[portfolio]">
            <i class="fa fa-search"></i>
        </a> 
        <% if VerlinkungID %><a href="$Verlinkung.Link">
            <i class="fa fa-link"></i>
        </a><% end_if %></div>
    </div>
</div>
<% end_loop %>
<% end_loop %>

答案 1 :(得分:0)

使用单个SQL查询执行此操作有点棘手,但并非不可能:

SELECT 
    id, classname, pageid
FROM
(
    SELECT 
        *, @row:=IF(pageid=@pageid, @row, 0) + 1 AS rn, @pageid:=pageid 
    FROM 
        (SELECT *, RAND() AS trand FROM bildergalerie) t1,
        (SELECT @row:=0, @pageid:='') sqlvars 
    ORDER BY 
        pageid, trand
) t2
WHERE rn <= 4

这为您提供了每个pageid组随机的四个记录组合在一个结果集中。