2016-02-04 116 views
1

我想加入多對一關係,但根據條件挑選其中一條記錄加入,本例中爲最大日期。這是一個簡化的模式;MySql根據條件加入多對一但只獲取一條相關記錄

parent 
--------- 
id | name 
--------- 
1 | Bob 
2 | Mary 
3 | Pat 

child 
---------------------------------- 
id | parent_id | name | birthdate 
---------------------------------- 
11 | 1   | Anne | 2014-01-01 
12 | 2   | Jane | 2014-01-02 
13 | 3   | John | 2016-06-01 
14 | 1   | Mark | 2016-08-01 
15 | 2   | Jack | 2016-01-01 
16 | 2   | Jill | 2016-01-01 

父母可以有零個或多個孩子。孩子的生日可以在未來(懷孕)。來自同一父母的兩個孩子可以有相同的生日(雙胞胎)。

我想獲得父母的記錄和他們最小的孩子。對於最年幼的雙胞胎,我不在乎選擇哪個孩子。所以在這種情況下,鮑勃有兩個孩子,他們最小的是馬克,他將於8月8日出生。瑪麗有3個孩子。她的兩個最小的雙胞胎是傑克和吉爾。帕特沒有孩子。所以我想得到;

id | name | child | birthdate 
----------------------------- 
1 | Bob | Mark | 2016-08-01 
2 | Mary | Jack | 2016-01-01 
3 | Pat | null | null 

是否可以在單個查詢中執行此操作?

+0

類似的問題,可能是有用的:http://stackoverflow.com/questions/12113699/get-top-n-records-for-each-group-of-grouped-results。從問題 – drneel

+0

的父母=組中,我認爲您的數據存在錯誤:id = 3的父母有一個孩子,「John」。 –

+0

父母不能有0個孩子 – Strawberry

回答

2
SELECT p.id, p.name, c.name, birthdate FROM parent p 
LEFT JOIN child c ON p.id = c.parent_id AND c.birthdate <= NOW() 
WHERE c.birthdate IS NULL OR birthdate = (SELECT MIN(birthdate) FROM child c2 WHERE c2.parent_id = p.id) 
GROUP BY p.id 

SQL小提琴這裏。 http://sqlfiddle.com/#!9/a5fec2/2

注意:輸入數據已被修改一點點以獲得所需的輸出。

1

您可以使用下面的查詢:

SELECT p.id, p.name, c.name, c.birthdate 
FROM parent AS p 
LEFT JOIN (
    SELECT parent_id, name, birthdate, 
     @rn := IF(@pid = parent_id, @rn + 1, 
        IF(@pid := parent_id, 1, 1)) AS rn 
    FROM child 
    CROSS JOIN (SELECT @rn := 0, @pid := 0) AS vars 
    ORDER BY parent_id, birthdate DESC 
) AS c ON p.id = c.parent_id AND c.rn = 1 

變量在派生表中使用,這樣才能得到每個父最新的孩子。

Demo here

1
SELECT 
    `p`.`id`, 
    `p`.`name`, 
    `c`.`name` AS `child`, 
    `c`.`birthday` 
FROM `parent` AS `p` 
LEFT JOIN `child` AS `c` 
ON `p`.`id` = `c`.`parent_id` 
GROUP BY `c`.`parent_id` 
ORDER BY `p`.`id`; 

http://sqlfiddle.com/#!9/b70acf/2