2011-12-22 50 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