给定的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
字段为Parent
,id
与Child
和parent_id
关联。查询如何获得包含两个孩子的所有name
,其中一个名称为' John'还有一个名叫' Mike'。我的问题是,我无法构建一个返回父母同时拥有两个孩子的查询。我使用了Parents
所以我还得到了父母回来,其中还有一个孩子的名字是' John'或者' Mike'。但我只想要父母和两个孩子。
Where IN ('John', 'Mike')
我的查询当然更复杂,这只是我想要实现的目标的抽象。我想到的是,我首先需要在parent_id上加入孩子并用它做点什么,但不知道。
答案 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)
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)
感谢您的想法和快速帮助:)