我想知道如何从一个集团中随机抽取一些成员,但我不知道最好的方法是什么,我认为ORDER BY RAND()不是最好的选择,因为一个集团可以有超过100,000个成员,执行此类型查询可能会很慢.
我发现这种方式使用SQL,但我不知道如何在DQL中做同样的事情:我如何优化MySQL的ORDER BY RAND()函数?
我有以下数据库方案:
table 'products'
id
category_id
Run Code Online (Sandbox Code Playgroud)
当然还有一个类别表,只有一个id.
数据看起来像这样:
Products
--------------------
| id | category_id |
--------------------
| 0 | 1 |
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
| 4 | 2 |
| 5 | 1 |
--------------------
Run Code Online (Sandbox Code Playgroud)
我想选择一个类别(例如类别1),因此我在product-repository类中选择该类别中的所有行:
return $this
->createQueryBuilder('u')
->andWhere('u.category = :category')
->setMaxResults(1)
->setParameter('category', $category->getId())
->getQuery()
->getSingleResult()
;
Run Code Online (Sandbox Code Playgroud)
我现在如何选择随机产品?另外:是否有可能通过关系来解决这个问题?
我在实体"类别"和"产品"之间有一个OneToMany关系,所以我也可以通过category-> getProducts()得到所有产品......
任何帮助都非常有用,谢谢
如何使用 dql 查询获得随机结果?
这是我的查询:
$firstCategoryId = 50;
$repository = $this->entityManager->getRepository(BaseProduct::class);
$products = $repository->createQueryBuilder('p')
->join('p.categories', 'c')
->where('c.id = :categoryId')
->setParameter('categoryId', $firstCategoryId)
->getQuery()
->setMaxResults(4)
->getResult();
Run Code Online (Sandbox Code Playgroud)
这总是让我返回前 4 个产品。假设 ID 为 50 的类别有 100 多种产品。我想要的是从 ID 为 50 的类别中随机查询 4 篇文章。但是如何?这可能吗?当然,我可以不设置 Max Result 而不是用 PHP 来设置……但由于性能原因,这不是一个好的解决方案。