【问题标题】:How to find latest record from two different tables如何从两个不同的表中查找最新记录
【发布时间】:2017-11-16 05:18:18
【问题描述】:

有2个表table1和table 2

第一列,foreign_id 是两个表之间的公共列。 所有相关列的数据类型都相同。


现在,我们需要根据时间戳列找到最新的记录,对于从两个表中获取的每个foreign_id,例如如下,还有一个额外的列from_table,它表明这是从哪个表中获取的行被选中。

我能想到的一种方法是

合并两个表 然后,为每个 foreign_id 列找到最新的

任何更好的方法可以做到这一点,因为两个表中可能有 5000 多行。

【问题讨论】:

  • 每个foreign_id是否在每个表中出现多次?
  • @ysth 是的,该表可以包含每个foreign_id 的多行

标签: mysql analytics


【解决方案1】:

试试这个:

SELECT
  t1.foreign_id,
  MAX(t1.timestamp) max_time_table1,
  MAX(t2.timestamp) max_time_table2
FROM *table1* t1
LEFT JOIN *table2* t2 USING (foreign_id)
GROUP BY foreign_id; 

注意:如果记录数量很大,这可能会有点慢。

但是你也可以使用这个:

SELECT a.foreign_id, 
IF(a.max_time_table1 > a.max_time_table2, a.max_time_table1, a.max_time_table2) latest_update
FROM(  
 SELECT
 t1.foreign_id,
 SUBSTRING_INDEX(GROUP_CONCAT(t1.timestamp ORDER BY t1.id DESC),',',1)    max_time_table1,
SUBSTRING_INDEX(GROUP_CONCAT(t2.timestamp ORDER BY t2.id DESC),',',1) max_time_table2
FROM *table1* t1
LEFT JOIN *table2* t2 USING (foreign_id)
GROUP BY foreign_id) a; 

确保两个表中的 id 列都是 auto_increment。

【讨论】:

  • 根据第一个答案,我们将得到 2 个名为 max_time_table1max_time_table2 的列,并且每当有匹配项根据连接条件然后有将是两列中的值。但我需要的结果是,对于每个外部 id 获取 1 行,并且该行可能来自 table1 或 table2 基于时间戳是最新的条件
  • 查看最后一个查询@abhi
【解决方案2】:

根据您的解释,这样可以:

 SELECT 
  foreign_id,
  CASE
   WHEN max_time_table1 < max_time_table2 THEN max_time_table2
   WHEN max_time_table2 < max_time_table1 THEN max_time_table1
 END as timestamps
FROM(
 SELECT
  t1.foreign_id,
  SUBSTRING_INDEX(GROUP_CONCAT(t1.timestamp ORDER BY t1.id DESC),',',1)    max_time_table1,
 SUBSTRING_INDEX(GROUP_CONCAT(t2.timestamp ORDER BY t2.id DESC),',',1) max_time_table2
FROM *table1* t1
LEFT JOIN *table2* t2 USING (foreign_id)
GROUP BY foreign_id) a; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    相关资源
    最近更新 更多