一尘不染

如何用学说随机选择

php

这是我在数据库中查询一些单词的方法

$query = $qb->select('w')
    ->from('DbEntities\Entity\Word', 'w')
    ->where('w.indictionary = 0 AND w.frequency > 3')
    ->orderBy('w.frequency', 'DESC')
    ->getQuery()
    ->setMaxResults(100);

我正在使用mysql,我想获得符合条件的随机行,我在查询中使用rand()的顺序。

我发现这个类似的问题基本上表明,由于在理论中不支持ORDER BY
RAND,因此可以将主键随机化。但是,在我的情况下无法做到这一点,因为我有一个搜索条件和一个where子句,因此并非每个主键都可以满足该条件。

我还找到了一个代码段,建议您使用OFFSET来随机化行,如下所示:

$userCount = Doctrine::getTable('User')
     ->createQuery()
     ->select('count(*)')
     ->fetchOne(array(), Doctrine::HYDRATE_NONE); 
$user = Doctrine::getTable('User')
     ->createQuery()
     ->limit(1)
     ->offset(rand(0, $userCount[0] - 1))
     ->fetchOne();

对于这是否可以帮助我解决在缺乏随机支持的情况下的工作,我有些困惑。我无法在setMaxResult之后添加偏移量。

知道如何实现吗?


阅读 294

收藏
2020-05-29

共1个答案

一尘不染

Doctrine团队不愿意实施此功能。

有几种解决方案,每种都有其缺点:

  • 添加一个自定义数字函数:请参见此DQL RAND()函数
    (如果您有很多匹配的行,可能会很慢)

  • 使用本机查询 (我个人试图避免这种解决方案,但我发现这种解决方案难以维护)

  • 首先发出原始SQL查询以随机获取一些ID,然后WHERE x.id IN(?)通过将ID数组作为参数传递,使用DQL 加载关联的对象。 该解决方案涉及两个单独的查询,但 可能会 比第一个解决方案具有更好的性能(不ORDER BY RAND()存在其他原始SQL技术,在此不做详细介绍,您可以在该网站上找到一些不错的资源)。

2020-05-29