最新記錄有2個表table1中和表2如何找到兩個不同的表
第一列,foreign_id是兩個表之間的公共列。 所有相關列的數據類型相同。現在
,我們需要根據時間戳列查找最新記錄,爲每個foreign_id的兩個表服用,例如下面,還有一個額外的列from_table,這說明從表中該行被選中。我能想到的
一種方法是
結合兩個表 然後,找到最新的每個foreign_id列
任何更好的方法來做到這一點是有可能在兩個表中都是5000+行。
最新記錄有2個表table1中和表2如何找到兩個不同的表
第一列,foreign_id是兩個表之間的公共列。 所有相關列的數據類型相同。現在
,我們需要根據時間戳列查找最新記錄,爲每個foreign_id的兩個表服用,例如下面,還有一個額外的列from_table,這說明從表中該行被選中。我能想到的
一種方法是
結合兩個表 然後,找到最新的每個foreign_id列
任何更好的方法來做到這一點是有可能在兩個表中都是5000+行。
試試這個:
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。
從你的解釋,這會做那麼:
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;
是否每個foreign_id看起來比在每個表一次? – ysth
@ysth是的,表中可以包含每個foreign_id的多行 – abhi