有2个表table1和表2
第一列 foreign_id 是两个表之间的公共列。 所有相关列的数据类型相同。
现在,我们需要找到基于时间戳列的最新记录,对于从这两个表中获取的每个foreign_id,例如如下所示,还有一个额外的列 from_table ,它显示了从哪个表这个行被选中。
我能想到的一种方法是
合并两个表格 然后,找到每个foreign_id列的最新信息
任何更好的方法,因为两个表中都可能有5000多行。
答案 0 :(得分: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。
答案 1 :(得分:0)
根据你的解释,这样就可以了:
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;