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