MySql将多对一连接起来,但根据条件只获取一条相关记录

MySql将多对一连接起来,但根据条件只获取一条相关记录,mysql,join,Mysql,Join,我想加入多对一关系,但根据条件选择要加入的记录之一,在本例中为最长日期。这是一个简化的模式 parent --------- id | name --------- 1 | Bob 2 | Mary 3 | Pat child ---------------------------------- id | parent_id | name | birthdate ---------------------------------- 11 | 1 | Anne | 2014

我想加入多对一关系,但根据条件选择要加入的记录之一,在本例中为最长日期。这是一个简化的模式

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日出生。玛丽有三个孩子。她最小的两个是双胞胎,杰克和吉尔。帕特没有孩子。所以我想得到

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

是否可以在单个查询中执行此操作

您可以使用以下查询:

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
在派生表中使用变量,以便获得每个父级的最新子级


您可以使用以下查询:

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
在派生表中使用变量,以便获得每个父级的最新子级

从父母p选择p.id、p.name、c.name、生日
在p.id=c.parent_id和c.birthdate
上左键连接子c,从父p选择p.id、p.name、c.name、birthdate
在p.id=c.parent_id和c.birthdate上左键连接子c


可能有用的类似问题:。对于问题中的parent=group,我认为您的数据中有一个错误:id=3的家长有一个孩子,
“John”
。家长不能有0个孩子,而Jane比Jack小。我认为您必须根据可能有用的类似问题更正您的输入或输出:。对于问题中的parent=group,我认为您的数据中有一个错误:id=3的家长有一个孩子,
“John”
。家长不能有0个孩子,而Jane比Jack小。我认为你必须相应地纠正你的输入或输出
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`;