使用左连接的查询返回的行数较少

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用左连接的查询返回的行数较少相关的知识,希望对你有一定的参考价值。

在Symfony项目中使用Doctrine会让我感到困惑。当从单个实体请求所有行时,我获得的行数比我将另一个表连接到同一个表时获得的行数更多。

这会返回更多行:

$query = $this->getEntityManager()->createQueryBuilder();
$query->select('obj')
    ->from('AppBundle:Data', 'obj');

比这个:

$query = $this->getEntityManager()->createQueryBuilder();
$query->select('obj')
    ->from('AppBundle:Data', 'obj')
    ->leftJoin('obj.subDatas', 'sd')
    ->leftJoin('sd.subSubDatas', 'ssd');

怎么会这样?我猜这可能是一个innerJoin的情况,但我认为使用leftJoin时结果至少会有多少行,或者更多行。

这是预期的吗?

UPDATE

所以我认为这种混淆的实际原因似乎是在上面的查询后添加的分页:

$query
    ->setMaxResults(20)
    ->setFirstResult(0);

看起来这与上面使用的leftJoin效果不佳(这就是为什么结果计数在第一个例子中是正确的)。使用leftJoins时如何让它返回正确的行数?

答案

如果您的左连接属于多个关系,则它是SQL中常见的笛卡尔积。来自obj的行扩展了sdssd的所有可能值。

如果要在DQL中使用toMany关系对查询进行分页,则需要一个适当的分页器来处理doctrine水合作用。

以上是关于使用左连接的查询返回的行数较少的主要内容,如果未能解决你的问题,请参考以下文章

Oracle_SQL 连接和子查询

左连接优于内连接?

sql(join on 和where的执行顺序)

sql(join on 和where的执行顺序)

sql(join on 和where的执行顺序)

外连接查询