2012-10-02 82 views
3

比方说,我想找出所有父母和我父母在同一班级的孩子。我可以写这样的查询:SQL:查找父母都是我的所有孩子

SELECT child.* FROM child 
JOIN parent ON child.ParentID = parent.ID 
    WHERE parent.class IN (SELECT parent1.class 
    FROM parent1 JOIN child1 
     ON parent1.id = child1.parentID 
    WHERE child1.ID = MyID) 

不知怎的,这感觉就像我做错了,我在写(约)相同的连接两次,但我不能想出一个办法来提高它(我可以找出嵌套子查询的其他方法,但没有一个看起来更整洁)。

有没有一个干净的方式做到这一点,我失踪了?或者我做对了吗?

编辑:正如GolzeTrol在他对这个问题的(完整)回答中所指出的,儿童被限制为只有一个父母是很奇怪的。他是完全正确的,我并不打算在实际的家庭中运行这个查询,而是在其他一些表格上,每个孩子实际上只与一个父母关联。

回答

2

只要加入他们。你必须加入两个表格两次,以获得相关的父母,然后他们的孩子,但除此之外,这是一个简单的内部联接。我添加了别名(在这种情况下您必须使用它)以明确每个表的“角色”。

select 
    otherkids.* 
from 
    child me 
    /* Join below is weird. I got only 1 parent... */ 
    inner join parent myparents on myparents.ID = me.ParentID 
    inner join parent otherparents on otherparents.class = myparents.class 
    inner join child otherkids on otherkids.ParentID = otherparents.ID 
where 
    me.ID = :MyID and 
    otherkids.ID <> me.ID /* Exclude myself */ 

我必须说,我认为这是奇怪的,一个孩子有一个PARENTID,而我认为一个孩子有一个母亲和一个父亲,或至少两个的父母。

家谱计划通常会把孩子放在家庭中。所以一个家庭有配偶和孩子。这样,即使你不认识父母(或只知道一个),也可以连接孩子,如果他们离婚并重新结婚,你可以轻松地将人们与多个家庭联系起来。也可能是你的表结构的建议。

+0

谢谢,那正是我想要的。只是没有想到自己加入一张桌子。关于结构,你是对的 - 我实际上并没有为儿童和父母这样做,但对于我的数据库中的一些儿童只有一位家长的表 - 我会在问题中留下一个注释。 –

-1

或许这能够解决您的问题

SELECT孩子。* FROM孩子INNER JOIN父ON child.ParentID = parent.ID INNER JOIN parent2 ON parent.class = parent2.class INNER JOIN的child2 ON child2.ParentID = parent.ID WHERE child.ID =本身份识别码和child2.ID <>身份识别码

确定试试这个呢:)

2

我@ GolezTrol的解决方案达成一致,但你仍然可以解决你的方式。为了使查询能够像你写的那样工作,你应该添加一个外部的WHERE子句,不包括你自己返回的子元素(按照@GolezTroi解决方案)。

此外,虽然它不会影响执行,但使用'='而不是'IN'样式子查询的语义更准确,因为您只希望子查询返回一条记录(即你的父母在一个类):

SELECT child.* FROM child 
JOIN parent ON child.ParentID = parent.ID 
    WHERE parent.class = (SELECT parent1.class 
    FROM parent1 JOIN child1 
     ON parent1.id = child1.parentID 
    WHERE child1.ID = MyID) 
    AND child.ID != MYID 

当然还是有,你正在使用相关子查询的问题(即你所加入的子查询到外部查询),并且这些往往比其他方法处理时间更长。至于你关于两次执行同​​一个连接的观点,SQL通常会迫使你在更复杂的查询中执行此操作,尤其是那些将记录与同一个表中的其他记录相关联的查询。

+0

用'='vs'in'进行智能思考。在这种情况下,子查询的确应该返回1条记录,而MySQL在'in'中特别慢。对于这个问题,我选择了“简单连接”。 ;-) – GolezTrol

相关问题