这是我在数据库中查询某些单词的方法
$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,我想获得符合条件的随机行,我将在查询中使用 order by rand() 。
I found 这个类似的问题基本上表明,由于原则上不支持 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 之后添加偏移量。
知道如何实现这一点吗?
教义团队不愿意实现这个功能.
您的问题有多种解决方案,每种方案都有其自身的缺点:
- Add a 自定义数值函数: 看这个DQL RAND() 函数
(如果你有很多匹配的行,可能会很慢)
- Use a 原生查询
(我个人尝试避免这种解决方案,我发现它很难维护)
- 首先发出原始 SQL 查询以随机获取一些 ID,然后使用 DQL
WHERE x.id IN(?)
通过将 ID 数组作为参数传递来加载关联对象。
该解决方案涉及两个单独的查询,但是might提供比第一个解决方案更好的性能(其他原始 SQL 技术比ORDER BY RAND()
存在,我不会在这里详细介绍它们,您可以在这个网站上找到一些很好的资源)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)