2013-12-17 57 views
1

我有一個父母表,將其稱爲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 

我試圖把不同的地方放在奇怪的地方,但似乎無法找出這一個。

+1

附加GROUP BY PARENT_ID在查詢 –

+0

結束嗯,這絕對適用於mySql,但我不確定它是否可以跨平臺使用。由於這是一個mySql環境,我不認爲我應該在意:D。感謝這個想法。 – Chris

回答

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) 

我假設children表具有'child_id'作爲我們可以用來獲取第一個孩子的PK。

你可以像 '時間戳' 或 'child_position',另一列替換child_id ...

+0

不錯的解決方案,我認爲可以在沒有第一個子查詢的情況下完成。謝謝您的幫助。 – Chris

+0

需要第一個子查詢(A)。你可以測試。 – Loc

0

寫意SQL: SELECT * 從父p 交叉連接Child C級 其中c.Id =(從兒童C2選擇MAX(c2.id),其中c2.ParentId = p.Id)

東西就像那樣會得到一個孩子與當前的父母並加入這兩個。 如果你希望它返回的東西,如果沒有孩子,安:

或不存在(從兒童C3選擇MAX(c3.id),其中c3.ParentId = p.Id)

乾杯 -

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 

SQL小提琴:http://sqlfiddle.com/#!2/03fdc/14