gpt4 book ai didi

pagination - 学说2 : Limiting with Left Joins/Pagination - Best Practice

转载 作者:行者123 更新时间:2023-12-04 10:27:47 26 4
gpt4 key购买 nike

我有一个大查询(在我的查询构建器中)和很多左连接。所以我得到了带有评论和标签等的文章。
假设我有以下 dql:

$dql = 'SELECT blogpost, comment, tags 
FROM BlogPost blogpost
LEFT JOIN blogpost.comments comments
LEFT JOIN blogpost.tags tags';

现在假设我的数据库有 100 多篇博文,但我只想要前 10 篇,但如果存在的话,还有这 10 篇的所有评论和所有标签。
如果我使用 setMaxResults 它会限制行。所以我可能会得到前两个帖子,但最后一个缺少一些评论或标签。所以以下不起作用。
$result = $em->createQuery($dql)->setMaxResults(15)->getResult();

使用几乎没有记录的 Pagination与doctrine2.2 一起提供的解决方案对我来说也不起作用,因为它太慢了,我也可以加载所有数据。

我尝试了 Stackoverflow Article 中的解决方案,但即使是那篇文章仍然缺少最佳实践,并且提出的解决方案非常缓慢。

没有关于如何做到这一点的最佳实践吗?
没有人在生产模式下使用 Doctrine2.2 吗?

最佳答案

通过这样的查询获得正确的结果是有问题的。 Doctrine 网站上有一个教程解释了这个问题。

Pagination

本教程更多地是关于分页而不是获得前 5 个结果,但总体思路是您需要执行“SELECT DISTINCT a.id FROM articles a ... LIMIT 5”而不是普通的 SELECT。它比这更复杂一点,但是该教程中的最后 2 点应该让您走上正轨。

更新:

这里的问题不在于 Doctrine 或任何其他 ORM。问题完全在于数据库能够返回您要求的结果。这就是联接的工作方式。

如果您对查询进行解释,它将为您提供有关正在发生的事情的更深入的答案。将其结果添加到您最初的问题中将是一个好主意。

基于分页文章中讨论的内容,您似乎需要至少 2 次查询才能获得所需的结果。向查询添加 DISTINCT 有可能显着减慢查询速度,但只有在您有连接时才真正需要它。您可以编写另一个查询,只检索按创建日期排序的前 10 个帖子,而无需连接。获得这 10 个帖子的 ID 后,对您的连接进行另一次查询,然后返回 WHERE blogpost.id IN (...) ORDER BY blogpost.created .这种方法应该效率更高。

SELECT 
bp
FROM
Blogpost bp
ORDER BY
bp.created DESC
LIMIT 10

由于您在第一个查询中只关心 ID,因此您可以将 Doctrine 设置为使用 Scalar Hydration。
SELECT 
bg
FROM
Blogpost bp
LEFT JOIN
bp.comments c
LEFT JOIN
bp.tags t
WHERE
bp.id IN (...)
ORDER BY
bp.created DESC

您也可以使用相关子查询在一个查询中完成。子查询总是不好的神话是不正确的。有时它们比连接更快。您需要进行试验以找出最适合您的解决方案。

关于pagination - 学说2 : Limiting with Left Joins/Pagination - Best Practice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10701792/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com