我有一个父表,称之为parents
。每个父级在第二个表中都有一些子级,称为children
。典型的左连接将是这样的:
select *
from parents p
left join children c
on p.id = c.parent_id
但是这将返回每个子行并重复所有父信息。我想要的是(对于这个应用程序)是每个父项的第一个子项,因此结果集与父表具有相同的行数。
Parent1 Child_of_parent1_1
Parent2 Child_of_parent2_1
Parent3 Child_of_parent3_1
我试图把它放在陌生的地方,但似乎无法把它弄清楚。
答案 0 :(得分:1)
SELECT A.* FROM
(
SELECT p.*, c.child_id, some_field_of_children
FROM parents p
LEFT JOIN children c ON p.id = c.parent_id
) A
WHERE A.child_id = ( SELECT MIN(B.child_id) FROM children B WHERE B.parent_id = A.parent_id)
我认为儿童表的'child_id'是我们可以用来获得第一个孩子的PK。
你可以用'timestamp'或'child_position'等其他列替换child_id,...
答案 1 :(得分:0)
手绘SQL: 选择 * 来自家长p 交叉加入儿童c 其中c.Id =(从子c2中选择max(c2.id),其中c2.ParentId = p.Id)
这样的东西会让1个孩子拥有当前的Parent并加入这两个孩子。 如果你想要它,如果没有孩子就返回东西,ann:
是否存在(从子c3中选择max(c3.id),其中c3.ParentId = p.Id)
干杯 -
答案 2 :(得分:0)
select
p.parent_id,
p.name as parent_name,
c.name as child_name
from parent p
join(
select * from child where child_id in(
select child_id from child
group by parent_id)) c
on p.parent_id = c.parent_id