You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并两条关联的MySQL SELECT语句 解决PHP循环查询低效问题

MySQL查询合并优化方案

合并后单条查询写法

原逻辑的核心是取符合条件的报价申请,同时关联每个申请最新的一条消息记录,合并后的查询如下,已经自动优化了原查询中冗余的owner_id != 0条件(等于64自然满足不等于0的要求):

兼容MySQL 5.7及更低版本写法

SELECT 
    qr.*,
    qm.reply_as,
    qm.member_id
FROM 
    quote_requests qr
LEFT JOIN 
    quote_messages qm ON qm.quote_id = qr.id
    AND qm.id = (SELECT MAX(id) FROM quote_messages WHERE quote_id = qr.id)
WHERE 
    qr.archived = 0 
    AND qr.owner_id = 64
ORDER BY 
    qr.id DESC

如果不需要展示没有任何消息的报价申请,可以把关联子查询放到WHERE条件里,执行效率更高:

SELECT 
    qr.*,
    qm.reply_as,
    qm.member_id
FROM 
    quote_requests qr
LEFT JOIN 
    quote_messages qm ON qm.quote_id = qr.id
WHERE 
    qr.archived = 0 
    AND qr.owner_id = 64
    AND qm.id = (SELECT MAX(id) FROM quote_messages WHERE quote_id = qr.id)
ORDER BY 
    qr.id DESC

MySQL 8.0+版本优化写法(窗口函数性能更高)

WITH latest_messages AS (
    SELECT 
        quote_id,
        reply_as,
        member_id,
        ROW_NUMBER() OVER (PARTITION BY quote_id ORDER BY id DESC) AS rn
    FROM quote_messages
)
SELECT 
    qr.*,
    lm.reply_as,
    lm.member_id
FROM quote_requests qr
LEFT JOIN latest_messages lm ON lm.quote_id = qr.id AND lm.rn = 1
WHERE 
    qr.archived = 0 
    AND qr.owner_id = 64
ORDER BY qr.id DESC

额外性能优化建议

加上以下两个索引后,查询耗时可降至毫秒级,彻底解决加载慢的问题:

  • 给quote_requests表添加联合索引:INDEX idx_owner_archived (owner_id, archived, id DESC),直接覆盖筛选和排序逻辑,避免全表扫描
  • 给quote_messages表添加联合索引:INDEX idx_quote_id (quote_id, id DESC),覆盖关联和最新消息取数逻辑,无需遍历全表消息

内容的提问来源于stack exchange,提问作者eddie_k

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:30:02