Sql 如何使用像右连接一样的左连接原则
所以我绞尽脑汁已经有一段时间了。在学说中没有权利联结的概念。我知道你可以像使用右连接一样使用左连接,但我无法在我的示例中找到它,这就是我在这里的原因 我的例子是: 我在学说中有一个实体,它与自身有一对一的关系,称为“父”。 我试图获得所有实体及其子实体(如果它们存在的话),并且没有重复 对于右连接,这很简单,因为我可以说:Sql 如何使用像右连接一样的左连接原则,sql,doctrine,left-join,Sql,Doctrine,Left Join,所以我绞尽脑汁已经有一段时间了。在学说中没有权利联结的概念。我知道你可以像使用右连接一样使用左连接,但我无法在我的示例中找到它,这就是我在这里的原因 我的例子是: 我在学说中有一个实体,它与自身有一对一的关系,称为“父”。 我试图获得所有实体及其子实体(如果它们存在的话),并且没有重复 对于右连接,这很简单,因为我可以说: SELECT parent.*, child.* FROM table child RIGHT JOIN table parent ON parent
SELECT parent.*, child.*
FROM table child
RIGHT JOIN table parent ON parent.id = child.parent_id
WHERE parent.parent_id is null;
但是使用左连接返回的结果是,我无法确定where子句应该是什么来过滤它们
所以我的问题是“学说有做右连接的方法吗”或者“我怎样才能像右连接一样使用左连接操作”
---编辑---
你们关于更改我选择的表的顺序的说法是正确的,但我使用的是原则,所以关系不包括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();
我不确定如何以及是否可以切换表的顺序。我还尝试创建另一个从实体到自身的关系(就像我创建父对象的方式),但称之为子对象。但是当我用新的模式更新数据库时,出现了错误
有什么想法吗?谢谢你的快速回复
---编辑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, child.changed_timestamp, child.parent_entity_id, parent.id,
parent.changed_timestamp, 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
我想用正确的连接sql实现结果。唯一的父实体及其关联的子实体(如果存在),但我需要使用条令来实现它。再次感谢 @491243的评论是正确的:如果您使用sql,这将是一个微不足道的问题,因为左连接和右连接很容易转换,关系谓词可以以任何顺序表示 真正的问题似乎不是如何将右连接重写为左连接,而是如何在另一个方向遍历关系。大概你不能就这样做吧
$em->createQueryBuilder()
->select(array('child', 'parent'))
->from('Entity', 'parent')
->leftjoin('parent.child', 'child')
->orderBy('parent.id','asc')
->getQuery()
->execute();
试试这个:
SELECT
parenttable.*, childtable.*
FROM childtable
RIGHT JOIN parenttable ON parenttable.id = childtable.parent_id
WHERE
parenttable.parent_id IS NULL
AND
childtable.childid IS NOT NULL;
您发布的左侧联接没有:其中parent.parent\u entity\u id为空 我猜在你的数据中,这意味着记录本身不是一个孩子 因此,如果您只需要作为左连接提供的右连接sql,请执行以下操作: 选择child.id、child.changed\u时间戳、child.parent\u实体\u id、parent.id, parent.changed\u时间戳,parent.parent\u实体\u id 从内容父项左侧加入child.parent\u entity\u id=parent.id上的内容子项
其中parent.parent\u entity\u id为空 按父项排序。id ASC
注意:如果您的数据允许多代,例如孙子辈等,则上面的where子句不仅过滤掉了子辈,还过滤掉了孙子辈。这对返回的子数据有影响:如果孩子是孙子,他们将不会被返回。不太熟悉教义脚本,但是。。。在大多数SQL脚本中,这种旧式的
连接
应该可以实现与右连接
相同的结果:
SELECT parent.*, child.*
FROM table child, table parent
WHERE parent.id = child.parent_id
OR child.parent_id IS NULL;
这两种说法是等价的:
SELECT parent.*, child.*
FROM table child
RIGHT JOIN table parent ON parent.id = child.parent_id
WHERE parent.parent_id is null;
SELECT parent.*, child.*
FROM table parent
LEFT JOIN table child ON child.parent_id = parent.id
WHERE parent.parent_id is null;
我从不使用正确的连接。我认为它只是为了完整性才包含在SQL中。您可以使用Join子句,它的结果与正确的Join相同
SELECT p.*, c.*
FROM child c,parent p
WHERE p.parent_id = c.parent_id
OR c.parent_id IS NULL;
child RIGHT JOIN tableparent ON parent.id=child.parent\u id
与tableparent LEFT JOIN child ON parent.id=child.parent\u id
相同,请提供示例数据和所需输出。您好@Alex Mamut,您能想出如何进行右连接吗?我也有同样的问题。