要在 MySQL 中查詢相同記錄并僅保留時間最晚的那一條,你可以使用以下幾種方法:
方法一:使用子查詢和 GROUP BY
假設你的表名為?your_table
,時間字段為?create_time
,其他用于判斷記錄相同的字段為?field1
,?field2
?等:
SELECT t1.*
FROM your_table t1
INNER JOIN (SELECT field1, field2, MAX(create_time) AS max_timeFROM your_tableGROUP BY field1, field2
) t2 ON t1.field1 = t2.field1 AND t1.field2 = t2.field2 AND t1.create_time = t2.max_time;
方法二:使用窗口函數(MySQL 8.0+)
如果你使用的是 MySQL 8.0 或更高版本,可以使用窗口函數更簡潔地實現:
WITH ranked_data AS (SELECT *,ROW_NUMBER() OVER (PARTITION BY field1, field2 ORDER BY create_time DESC) AS rnFROM your_table
)
SELECT * FROM ranked_data WHERE rn = 1;
方法三:使用 LEFT JOIN 排除法
SELECT t1.*
FROM your_table t1
LEFT JOIN your_table t2 ON t1.field1 = t2.field1 AND t1.field2 = t2.field2 AND t1.create_time < t2.create_time
WHERE t2.id IS NULL;
實際示例
假設有一個?orders
?表,包含?order_id
,?customer_id
,?product_id
,?order_time
?字段,我們想保留每個客戶對每個產品的最新訂單:
-- 方法一示例
SELECT o1.*
FROM orders o1
INNER JOIN (SELECT customer_id, product_id, MAX(order_time) AS latest_timeFROM ordersGROUP BY customer_id, product_id
) o2 ON o1.customer_id = o2.customer_id AND o1.product_id = o2.product_id AND o1.order_time = o2.latest_time;-- 方法二示例(MySQL 8.0+)
WITH latest_orders AS (SELECT *,ROW_NUMBER() OVER (PARTITION BY customer_id, product_id ORDER BY order_time DESC) AS rnFROM orders
)
SELECT * FROM latest_orders WHERE rn = 1;
注意事項
- 如果有多條記錄具有相同的最大時間戳,上述查詢會返回所有這些記錄
- 對于大型表,方法二(窗口函數)通常性能最好
- 確保在用于分組的字段和時間字段上有適當的索引以提高查詢性能
選擇哪種方法取決于你的 MySQL 版本、表大小和具體需求。