2011-12-22 41 views
5

到目前爲止,我認爲教義沒有選擇隨機行的方法。所以我想我有一個查詢得到的行數原則2隨機選擇一行(偏移0或1索引)?

// pseudo code 
$count = SELECT COUNT(i) FROM Item i WHERE ... 

然後有一個真正的查詢使用隨機從PHP偏移獲得該項目投入setFirstResult

$item = (SELECT i FROM Item WHERE ...)->setMaxResults(1)->setFirstResult(rand(0, $count))->getSingleResult() 

的問題是,我的rand()我是從0還是1開始?那麼最後呢? $count$count-1

回答

5

setFirstResult()是從0開始的。

按照你的方法,你必須使用:

->setFirstResult(rand(0, $count - 1))->setMaxResults(1)->getSingleResult(); 

來源:

我同意的文件是在這一點上目前還不清楚。但是,我們可以看到,學說\ DBAL \查詢\ QueryBuilder的採用這種方式:

->modifyLimitQuery($query, $this->maxResults, $this->firstResult); 

那麼這是翻譯的原則\ DBAL \平臺\到SQL AbstractPlatform:

final public function modifyLimitQuery($query, $limit, $offset = null) 
{ 
    ... 
    $query .= ' OFFSET ' . $offset; 

OFFSET爲0在SQL中,我們可以推斷setFirstResult()也是基於0的。

0

我在我的應用程序中使用:

$item = (SELECT i FROM Item WHERE ...) 
    ->setMaxResults($count) 
    ->setFirstResult(1)->getSingleResult(); 

開始從1數到總數的記錄

+1

這是否選擇一個隨機行?或者你的意思是第一個結果從1開始?所以要選擇一個隨機行,我會' - > setMaxResults(1) - > setFirstResult(rand(1,$ count))'? – 2011-12-22 09:06:47

+0

我的意思是第一個結果是1,最後一個是總數 – rkmax 2011-12-22 09:17:24

+0

也許你誤會了我,我想要一個*單個*隨機行 – 2011-12-22 14:45:46

0

不,你從0或1開始的事情,你必須採取相應的端計數,計數-1分別爲

+0

對不起,你的意思是?如果我使用0或1,我認爲他們肯定會有差別嗎? – 2011-12-22 09:05:07

+0

是的,有一個區別,解釋繼續用它自己的規範..r8 ..因此它取決於用法 – 2011-12-22 09:50:48

+0

你是什麼意思由r8? – 2011-12-22 14:46:21