SQL get Parent其中Children具有特定值

时间:2018-06-05 17:57:09

标签: sql join

给定的import timeit x = np.random.randint(0,10,(100000, 100)) def np_method(arr = x): return np.vstack([np.insert(arr[arr[:,0] == i][:,1:].sum(axis=0),0,i) for i in np.unique(arr[:,0])]) def pd_method(df = pd.DataFrame(x)): return df.groupby(0).sum().reset_index().values >>> timeit.timeit(pd_method, number = 100) / 100 0.12673938989639283 >>> timeit.timeit(np_method, number = 100) / 100 0.09724574089050293 字段为ParentidChildparent_id关联。查询如何获得包含两个孩子的所有name,其中一个名称为' John'还有一个名叫' Mike'。我的问题是,我无法构建一个返回父母同时拥有两个孩子的查询。我使用了Parents所以我还得到了父母回来,其中还有一个孩子的名字是' John'或者' Mike'。但我只想要父母和两个孩子。

Where IN ('John', 'Mike')

我的查询当然更复杂,这只是我想要实现的目标的抽象。我想到的是,我首先需要在parent_id上加入孩子并用它做点什么,但不知道。

4 个答案:

答案 0 :(得分:1)

尝试在where子句中执行两个步骤。返回父记录时,两个条件都必须为真。

where parent.id in (select parent_id from child where child.name='John')
and parent.id in (select parent_id from child where child.name='Mike')

答案 1 :(得分:1)

您可以进行两次加入并查找您的特定记录。此示例显示父级1将返回两个kiddos,但不会返回只有Mike的父级2。

DECLARE @parent TABLE (ID INT)
DECLARE @child TABLE (ID INT, parentID INT, name VARCHAR(100))

INSERT INTO @parent 
VALUES 
(1),
(2),
(3),
(4),
(5),
(6)

INSERT INTO @child (ID, parentID, name)
VALUES 
(1, 1, 'Mike'),
(2, 1, 'John'),
(3, 2, 'Mike'),
(4, 2, 'Bill'),
(5, 3, 'Dave'),
(6, 4, 'Sam')

SELECT p.*

FROM @parent p

INNER JOIN @child c1
    ON c1.parentID = p.id
    AND c1.name = 'Mike'

INNER JOIN @child c2
    ON c2.parentID = p.ID
    AND c2.name = 'John'

答案 2 :(得分:0)

如果你有这样的话,这样的东西可以在postgres中使用。

SELECT parent_id, SUM(num) FROM (
  SELECT parent_id, 1 as num FROM Child Where name = 'John'
  UNION
  SELECT parent_id, 1 as num FROM Child Where name = 'Mike'
) parents 
GROUP BY parent_id HAVING SUM(num) = 2 

答案 3 :(得分:0)

所以, 将带有双连接的解决方案添加到Ecto查询中,它通过了我的测试:)

from c in Child,
join: p in Parent, on: c.parent_id = p.id,
join: cc in Child, on: p.id = cc.parent_id,
where: c.name == ^"John",
where: cc.name == ^"Mike"
select: count(p.id)

感谢您的想法和快速帮助:)