在MySQL中,子查询是指嵌套在另一个SQL查询中的查询语句。当需要从连接表中获取最新值时,通常涉及到以下几种技术:
使用子查询获取连接表的最新值有以下优势:
SELECT
a.id,
a.name,
(SELECT b.value
FROM related_table b
WHERE b.main_id = a.id
ORDER BY b.created_at DESC
LIMIT 1) AS latest_value
FROM main_table a;
SELECT
a.*,
b.latest_value
FROM
main_table a
JOIN (
SELECT
main_id,
value AS latest_value
FROM
related_table
WHERE
(main_id, created_at) IN (
SELECT
main_id,
MAX(created_at)
FROM
related_table
GROUP BY
main_id
)
) b ON a.id = b.main_id;
SELECT
a.*,
b.value AS latest_value
FROM
main_table a
LEFT JOIN
related_table b ON a.id = b.main_id
LEFT JOIN
related_table b2 ON b.main_id = b2.main_id AND b.created_at < b2.created_at
WHERE
b2.id IS NULL;
原因:子查询对每行主表数据都执行一次,导致性能问题
解决方案:
原因:当有多条记录具有相同的最新时间戳时
解决方案:
原因:主表记录在子表中没有对应记录
解决方案:
-- MySQL 8.0+ 使用窗口函数
SELECT
a.*,
b.value AS latest_value
FROM
main_table a
JOIN (
SELECT
main_id,
value,
ROW_NUMBER() OVER (PARTITION BY main_id ORDER BY created_at DESC) AS rn
FROM
related_table
) b ON a.id = b.main_id AND b.rn = 1;
通过以上方法,可以高效地从连接表中获取最新值,并根据具体场景选择最适合的实现方式。