Sql 从左连接到第一个表的第二个表中获取最新记录
我有一个候选表,比如说Sql 从左连接到第一个表的第二个表中获取最新记录,sql,mysql,Sql,Mysql,我有一个候选表,比如说candidates只有id字段,我把加入的profiles表留给了它。表profiles有两个字段,即candidate\u id和name e、 g.表候选对象: id ---- 1 2 candidate_id name ---------------------------- 1 Foobar 1 Foobar2 2 Foobar3 和表配置文件
candidates
只有id
字段,我把加入的profiles
表留给了它。表profiles
有两个字段,即candidate\u id
和name
e、 g.表候选对象:
id
----
1
2
candidate_id name
----------------------------
1 Foobar
1 Foobar2
2 Foobar3
和表配置文件:
id
----
1
2
candidate_id name
----------------------------
1 Foobar
1 Foobar2
2 Foobar3
我想在下面给出的单个查询中获得候选人的最新姓名:
SELECT C.id, P.name
FROM candidates C
LEFT JOIN profiles P ON P.candidate_id = C.id
GROUP BY C.id
ORDER BY P.name;
但此查询返回:
1 Foobar
2 Foobar3
…而不是:
1 Foobar2
2 Foobar3
使用子查询:
SELECT C.id, (SELECT P.name FROM profiles P WHERE P.candidate_id = C.id ORDER BY P.name LIMIT 1);
使用子查询:
SELECT C.id, (SELECT P.name FROM profiles P WHERE P.candidate_id = C.id ORDER BY P.name LIMIT 1);
问题在于,您的PROFILES
表没有提供可靠的方法来确定最新的名称
值。配置文件
表有两个选项:
添加日期时间列,即:created\u date
定义一个自动增量列
第一个选项是最好的-它是明确的,这意味着列的使用是绝对明显的,并且可以更好地处理回溯条目
ALTER TABLE PROFILES ADD COLUMN created_date DATETIME
如果您希望在插入记录时,如果没有提供值,则在末尾添加以下内容:
DEFAULT CURRENT_TIMESTAMP
有了这些,您可以使用以下方法获得所需的结果:
SELECT c.id,
p.name
FROM CANDIDATES c
LEFT JOIN PROFILES p ON p.candidate_id = c.id
JOIN (SELECT x.candidate_id,
MAX(x.created_date) AS max_date
FROM PROFILES x
GROUP BY x.candidate_id) y ON y.candidate_id = p.candidate_id
AND y.max_date = p.created_date
GROUP BY c.id
ORDER BY p.name
问题在于,您的PROFILES
表没有提供可靠的方法来确定最新的名称
值。配置文件
表有两个选项:
添加日期时间列,即:created\u date
定义一个自动增量列
第一个选项是最好的-它是明确的,这意味着列的使用是绝对明显的,并且可以更好地处理回溯条目
ALTER TABLE PROFILES ADD COLUMN created_date DATETIME
如果您希望在插入记录时,如果没有提供值,则在末尾添加以下内容:
DEFAULT CURRENT_TIMESTAMP
有了这些,您可以使用以下方法获得所需的结果:
SELECT c.id,
p.name
FROM CANDIDATES c
LEFT JOIN PROFILES p ON p.candidate_id = c.id
JOIN (SELECT x.candidate_id,
MAX(x.created_date) AS max_date
FROM PROFILES x
GROUP BY x.candidate_id) y ON y.candidate_id = p.candidate_id
AND y.max_date = p.created_date
GROUP BY c.id
ORDER BY p.name