MariaDB 10.3替代LATERAL/CROSS APPLY实现最新笔记日期查询
适配MariaDB 10.3的查询方案
针对你的需求——查询所有工单及其关联的最新笔记post_date,在MariaDB 10.3不支持LATERAL的情况下,可以用以下几种替代方案:
方案1:SELECT子句中使用关联子查询
这种写法最接近你原本的LATERAL思路,直接为每个工单单独查询最新的笔记日期:
SELECT t.*, (SELECT note.post_date FROM note WHERE note.ticket_id = t.id ORDER BY note.post_date DESC LIMIT 1) AS latest_post_date FROM ticket t;
如果需要只保留有笔记的工单,可以添加过滤条件:
SELECT t.*, (SELECT note.post_date FROM note WHERE note.ticket_id = t.id ORDER BY note.post_date DESC LIMIT 1) AS latest_post_date FROM ticket t WHERE EXISTS (SELECT 1 FROM note WHERE note.ticket_id = t.id);
方案2:先聚合笔记表再关联
先在笔记表中分组找出每个工单的最新post_date,再与工单表关联,适合数据量较大的场景:
SELECT t.*, n.latest_post_date FROM ticket t LEFT JOIN ( SELECT ticket_id, MAX(post_date) AS latest_post_date FROM note GROUP BY ticket_id ) n ON t.id = n.ticket_id;
若要排除无笔记的工单,将LEFT JOIN替换为INNER JOIN即可。
方案3:笔记表自连接筛选最新记录
通过自连接找到每个工单中post_date最大的笔记,再关联工单表,这种方式适合需要同时获取笔记其他字段的场景:
SELECT t.*, n.post_date AS latest_post_date FROM ticket t LEFT JOIN note n ON t.id = n.ticket_id LEFT JOIN note n2 ON n.ticket_id = n2.ticket_id AND n.post_date < n2.post_date WHERE n2.id IS NULL;
这里利用自连接逻辑:筛选出没有比当前笔记post_date更大的记录,即为对应工单的最新笔记。
内容的提问来源于stack exchange,提问作者Phaelax
相关产品推荐
相关产品推荐

