JCM*_*JCM 10 php random dql doctrine-orm
我想知道如何从一个集团中随机抽取一些成员,但我不知道最好的方法是什么,我认为ORDER BY RAND()不是最好的选择,因为一个集团可以有超过100,000个成员,执行此类型查询可能会很慢.
我发现这种方式使用SQL,但我不知道如何在DQL中做同样的事情:我如何优化MySQL的ORDER BY RAND()函数?
Jea*_*ean 12
为了不降低性能我通常做如下:
//Retrieve the EntityManager first
$em = $this->getEntityManager();
//Get the number of rows from your table
$rows = $em->createQuery('SELECT COUNT(u.id) FROM AcmeUserBundle:User u')->getSingleScalarResult();
$offset = max(0, rand(0, $rows - $amount - 1));
//Get the first $amount users starting from a random point
$query = $em->createQuery('
SELECT DISTINCT u
FROM AcmeUserBundle:User u')
->setMaxResults($amount)
->setFirstResult($offset);
$result = $query->getResult();
Run Code Online (Sandbox Code Playgroud)
当然,$amount您将检索的用户对象是连续的(即第i,第(i + 1),......,(i + $amount) -),但通常需要在一个或两个实体处随机,而不是整个列表.因此,我认为这是一个有效的选择.
我不知道有什么方法可以从 Doctrine 中“有效”地 ORDER BY RAND() 。在您的情况下,最好的办法可能是首先获取主键,将这些键打乱,然后在 IN 语句中使用它们。
您还可以添加一个缓存层来放置第一个查询中的键(子集),特别是如果您有许多记录,以避免每次都对键重复查询。
| 归档时间: |
|
| 查看次数: |
12744 次 |
| 最近记录: |