Php 使用命令获取随机记录

Php 使用命令获取随机记录,php,random,doctrine-orm,dql,Php,Random,Doctrine Orm,Dql,我想知道如何从一个组中获得随机数目的成员,但我不知道最好的方法是什么,我认为ORDER BY RAND()不是最好的选择,因为一个组可能有100000多个成员,执行这种类型的查询可能非常慢 我找到了使用SQL进行排序的方法,但我不知道如何在DQL中执行相同的操作:我不知道有什么方法可以根据原则“有效地”按RAND()排序。在您的情况下,最好的方法可能是首先获取主键,将这些键洗牌,然后在In语句中使用它们 您还可以添加一个缓存层,用于放置第一个查询中的键(其中的一个子集),特别是如果您有许多记录,

我想知道如何从一个组中获得随机数目的成员,但我不知道最好的方法是什么,我认为
ORDER BY RAND()
不是最好的选择,因为一个组可能有100000多个成员,执行这种类型的查询可能非常慢


我找到了使用SQL进行排序的方法,但我不知道如何在DQL中执行相同的操作:

我不知道有什么方法可以根据原则“有效地”按RAND()排序。在您的情况下,最好的方法可能是首先获取主键,将这些键洗牌,然后在In语句中使用它们


您还可以添加一个缓存层,用于放置第一个查询中的键(其中的一个子集),特别是如果您有许多记录,这样可以避免每次对键重复查询。

您可以使用找到的查询,通过本机sql查询高效地检索N个随机记录的ID,然后使用dql通过(…)中的
获取对象,执行条令查询

例如:

// fetch $randomIds via native sql query using $em->getConnection()->... methods
// or from a memory based cache

$qb = $em->createQueryBuilder('u');

$em->createQuery('
    SELECT u
    FROM Entity\User
    WHERE ' . $qb->expr()->in('u.id', $randomIds) . '
');
如果您从缓存中获取随机ID(例如,可能使用),那么同样的策略也适用-首先获取ID,然后通过
中的WHERE
获取实体


您只需确保缓存的ID与数据库同步(删除的ID将从数据库和缓存中删除等)

为了不降低性能,我通常会执行以下操作:

//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();  

当然,您将检索的
$amount
用户对象是连续的(即第i个,(i+1)-th,,(i+
$amount
)-th),但通常需要随机获取一个或两个实体,而不是整个列表。因此,我认为这是一个有效的选择。

我有一个观察。使用
$em->getConnection()->…
或通过
$em->createQuery(“…sql query…”)
通过本机sql查询获取ID对您来说是不一样的?可能是重复的