这是我在数据库中查询一些单词的方法
$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之后添加偏移量。
知道如何实现吗?
Doctrine团队不愿意实施此功能。
有几种解决方案,每种都有其缺点:
添加一个自定义数字函数:请参见此DQL RAND()函数 (如果您有很多匹配的行,可能会很慢)
使用本机查询 (我个人试图避免这种解决方案,但我发现这种解决方案难以维护)
首先发出原始SQL查询以随机获取一些ID,然后WHERE x.id IN(?)通过将ID数组作为参数传递,使用DQL 加载关联的对象。 该解决方案涉及两个单独的查询,但 可能会 比第一个解决方案具有更好的性能(不ORDER BY RAND()存在其他原始SQL技术,在此不做详细介绍,您可以在该网站上找到一些不错的资源)。
WHERE x.id IN(?)
ORDER BY RAND()