sql – 如何在Doctrine中使用左连接,如右连接

前端之家收集整理的这篇文章主要介绍了sql – 如何在Doctrine中使用左连接,如右连接前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我现在已经绞尽脑汁待了一会儿.在Doctrine中,没有正确连接的概念.我知道你可以像右连接一样使用左连接,但我无法弄清楚我的例子,这就是为什么我在这里.

我的例子:
我在Doctrine中有一个实体,它与自己有一对一的关系,称为“父”.
我试图让所有实体及其子(如果存在)没有重复.

通过正确的连接,这很简单,因为我可以说:

SELECT parent.*,child.*
    FROM table child
    RIGHT JOIN table parent ON parent.id = child.parent_id
    WHERE parent.parent_id is null;

但是使用左连接我返回结果,我无法弄清楚where子句应该过滤掉它们.

所以我的问题是“教条是否有办法正确加入”或“如何使用左连接操作,如右连接”?

– -编辑 – –

你们对改变我选择的表的排序有什么看法是正确的,但是我使用的是Doctrine,所以关系确实是child-> parent.这是我的学说查询

我的实体:

/**
 * @Entity
 * @Table(name="entity")
 */
class Entity
{
...
/**
 * @OneToOne(
 *     targetEntity="Entity",*     fetch="EAGER"
 * )
 * @JoinColumn(name="parent_id",referencedColumnName="id")
 */
private $parent;
...
}

我的学说选择声明:

$em->createQueryBuilder()
->select(array('child','parent'))
->from('Entity','child')
->leftjoin('child.parent','parent')
->orderBy('parent.id','asc')
->getQuery()
->execute();

我不知道如何以及如何切换表的排序.我也尝试过创建另一个从实体到自身的关系(就像我做父母一样)但是把它叫做孩子.但是,当我使用新架构doctrine更新db时抛出错误.

有任何想法吗?并感谢您的快速反应!

—编辑2 —

左连接sql和结果:

SELECT child.id,child.changed_timestamp,child.parent_entity_id,parent.id,parent.changed_timestamp,parent.parent_entity_id 
FROM content child 
LEFT JOIN content parent ON child.parent_entity_id = parent.id   
ORDER BY parent.id ASC

child_id    child_timestamp parent_entity_id    parent_id   parent_timestamp    parent_entity_id
1           8/16/12 20:29   NULL                NULL        NULL                NULL
7           9/20/12 16:07   NULL                NULL        NULL                NULL
8           8/17/12 16:08   NULL                NULL        NULL                NULL
9           8/17/12 20:44   NULL                NULL        NULL                NULL
10          8/17/12 21:03   NULL                NULL        NULL                NULL
11          8/17/12 21:17   NULL                NULL        NULL                NULL
194         9/19/12 9:58    NULL                NULL        NULL                NULL
195         9/20/12 10:38   NULL                NULL        NULL                NULL
196         9/19/12 11:58   NULL                NULL        NULL                NULL
197         NULL            196                 196         9/19/12 11:58       NULL
200         9/20/12 16:02   1                   1           8/16/12 20:29       NULL
202         9/20/12 16:35   NULL                NULL        NULL                NULL
204         9/21/12 8:41    NULL                NULL        NULL                NULL
206         NULL            204                 204         9/21/12 8:41        NULL

正确的加入结果:

SELECT child.id,parent.parent_entity_id 
FROM content child 
RIGHT JOIN content parent ON child.parent_entity_id = parent.id   
WHERE parent.parent_entity_id is null
ORDER BY parent.id ASC

child_id    child_timestamp parent_entity_id    parent_id   parent_timestamp    parent_entity_id
200         9/20/12 16:02   1                   1           8/16/12 20:29       NULL
NULL        NULL            NULL                7           9/20/12 16:07       NULL
NULL        NULL            NULL                8           8/17/12 16:08       NULL
NULL        NULL            NULL                9           8/17/12 20:44       NULL
NULL        NULL            NULL                10          8/17/12 21:03       NULL
NULL        NULL            NULL                11          8/17/12 21:17       NULL
NULL        NULL            NULL                194         9/19/12 9:58        NULL
NULL        NULL            NULL                195         9/20/12 10:38       NULL
197         NULL            196                 196         9/19/12 11:58       NULL
NULL        NULL            NULL                202         9/20/12 16:35       NULL
206         NULL            204                 204         9/21/12 8:41        NULL

我想用正确的join sql来实现结果.具有关联子级的唯一父实体(如果存在)但我需要使用doctrine来实现它.再次感谢!

解决方法

@ 491243的评论是正确的:如果您使用的是s,这将是一个微不足道的问题,因为左右连接很容易转换,关系谓词可以按任何顺序表示.

真正的问题似乎不是如何将右连接重写为左连接,而是如何在另一个方向上遍历您的关系.想必你不能做这样的事情吗?:

$em->createQueryBuilder()
->select(array('child','parent')
->leftjoin('parent.child','child')
->orderBy('parent.id','asc')
->getQuery()
->execute();

猜你在找的MsSQL相关文章