2017-06-14 89 views
0

最新記錄有2個表table1中和表2如何找到兩個不同的表

table1 data

table2 data

第一列,foreign_id是兩個表之間的公共列。 所有相關列的數據類型相同。現在


,我們需要根據時間戳列查找最新記錄,爲每個foreign_id的兩個表服用,例如下面,還有一個額外的列from_table,這說明從表中該行被選中。我能想到的 result table

一種方法是

結合兩個表 然後,找到最新的每個foreign_id列

任何更好的方法來做到這一點是有可能在兩個表中都是5000+行。

+0

是否每個foreign_id看起來比在每個表一次? – ysth

+0

@ysth是的,表中可以包含每個foreign_id的多行 – abhi

回答

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。

+0

根據第一個答案,我們將得到2列,名爲** max_time_table1 **和** max_time_table2 ** 並且每當有匹配根據連接條件那麼這兩列都會有價值。 但我需要的結果是,對於每個外部id得到1行,並且該行可能來自table1或table2基於時間戳最新的條件 – abhi

+0

請參閱最後一個查詢@abhi – Dickson

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; 
相關問題