我们在我们的数据库(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();
}
答案 0 :(得分:0)
您必须向Doctrine解释RAND()
函数。请注意,EntityManager
的{{1}}期望DQL,而不是SQL,而且Doctrine不知道如何对待它,因为可能它并不是所有Doctrine的DB后端都支持的。
查看this answer,它包含有关在Doctrine中手动实施createQuery
的所有信息。