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`;