根据另一列的最大值从表中选择列

时间:2019-10-24 22:02:12

标签: sql

我有两个表,我希望根据最近的结束时间从first_table输入列,从second_table输出列

first_table:

id    input    
--------------
1     America    
2     China      
3     Russia     
2     China      
3     Russia     

second_table

id    output     finished_time
-------------------------------------------------
1     Washington    10/5/2019 10:05:13 PM +00:00
2     Shanghai      10/6/2019 10:05:13 PM +00:00
3     Kazan         10/7/2019 10:05:13 PM +00:00
2     Beijing       10/10/2019 10:05:13 PM +00:00
3     Moscow        10/11/2019 10:05:13 PM +00:00

result_table

id    input      output  
-----------------------------
1     America    Washington
2     China      Beijing
3     Russia     Moscow

我正在尝试使用此查询:

SELECT input, second_table.output
FROM first_table
INNER JOIN second_table ON first_table.id = second_table.id 
                        AND Max(finished_time)

3 个答案:

答案 0 :(得分:1)

您可以在联接的utf8mb4_general_ci子句中使用相关子查询:

COLLATE utf8_unicode_ci

为了提高性能,您需要在on上建立索引。

这也可以用select f.*, s.output from first_table f inner join second_table s on s.id = f.id and s.finished_time = ( select max(s1.finished_time) from second_table s1 where s1.id = s.id ) 条件表示:

second_table(id, finished_time)

最后,另一种选择是使用窗口函数进行排名

not exists

您可以试用各种解决方案,并选择一种您更了解或执行得更快的解决方案。

答案 1 :(得分:1)

您可以使用每个国家/地区最多可使用finished_time的派生表,然后将其联接回国家和城市表:

SELECT t1.id, t1."input", t2."output"
FROM (SELECT DISTINCT id, "input"
      FROM first_table) t1
JOIN second_table t2 ON t2.id = t1.id
JOIN (SELECT id, MAX(finished_time) AS max_time
      FROM second_table t2
      GROUP BY id) m ON m.id = t2.id AND m.max_time = t2.finished_time
ORDER BY t1.id

输出:

ID  input       output
1   America     Washington
2   China       Shanghai
3   Russia      Kazan

Demo on dbfiddle

请注意,我在SELECT DISTINCT中添加了first_table,因为您在该表中有重复的行,然后将在输出中导致重复的行。

答案 2 :(得分:0)

如果您的second_table.finished_time具有关联的索引,这也很有效

SELECT input , second_table.output
FROM first_table
INNER JOIN second_table ON first_table.id= second_table.id
ORDER BY second_table.finished_time DESC
limit 1;