为什么兰德()没有为doctrine2工作

时间:2014-04-16 11:43:37

标签: mysql symfony doctrine-orm

我们在我们的数据库(500万条记录)上有这个查询

SELECT *
FROM foo
ORDER BY RAND()
LIMIT 20;

当然很慢(2.7秒)

所以我们优化了对此的查询(而不是订购500个记录,它选择100并订购它们):

SELECT *
FROM foo
WHERE RAND() < 0.00001
ORDER BY RAND()
LIMIT 20;

查询时间现在为0.002秒

对于Symfony2项目,我们需要在doctrine上运行

public function findAllRandom()
{
   return $this->getEntityManager()
    ->createQuery(
        'SELECT p FROM GabrielUploadBundle:Image p WHERE RAND() < 0.0001 ORDER BY RAND() LIMIT 20')
    ->getResult();
}

但它会抛出此错误

  

[语法错误]第0行,第48列:错误:预期已知函数,得到   'RAND'

我似乎不知道RAND功能

这是一个可行的查询(如果它有帮助)

   public function findAllRandom()
    {
       return $this->getEntityManager()
        ->createQuery(
            'SELECT p FROM GabrielUploadBundle:Image p WHERE p.upvotes > 3')
        ->getResult();
    }

1 个答案:

答案 0 :(得分:0)

您必须向Doctrine解释RAND()函数。请注意,EntityManager的{​​{1}}期望DQL,而不是SQL,而且Doctrine不知道如何对待它,因为可能它并不是所有Doctrine的DB后端都支持的。

查看this answer,它包含有关在Doctrine中手动实施createQuery的所有信息。