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

如何将多UNION的MySQL查询优化为单查询?

问题描述

这是我在Stack Overflow的第一个问题,请多多包涵。

数据表

医生姓名(namadokter)门店名称(namaoutlet)交易单号(notransaksi)处方日期(tanggalresep)总账单金额(totaltagihan)
richard chandra spkfakfa1322023-06-011200
richard chandra spkfakfa1322023-06-011300
richard chandra spbkfbkfb1332023-06-01700
richard chandra spbkfbkfb1332023-06-01800
agus hidayat spkfakfa1002023-06-011000
agus hidayat spkfakfa1002023-06-012000
agus hidayat spbkfbkfb1112023-06-013000
agus hidayat spbkfbkfb1112023-06-012000

当前查询语句

SELECT  *, ROW_NUMBER() OVER(ORDER BY namadokter) row_num
  FROM (
(SELECT  namadokter,namaoutlet,  COUNT(notransaksi) AS jenis_obat,sum(totaltagihan)
FROM laporandokterunitsurabaya
where namadokter like '%richard chandra%' and (tanggalresep BETWEEN (SELECT tstart FROM tanggal WHERE id=1) AND (SELECT tend FROM tanggal WHERE id=1))
group by namaoutlet
order by namadokter) 
union 
(SELECT  namadokter,namaoutlet,  COUNT(notransaksi) AS jenis_obat,sum(totaltagihan)
FROM laporandokterunitsurabaya
where namadokter like '%agus hidayat%' and (tanggalresep BETWEEN (SELECT tstart FROM tanggal WHERE id=1) AND (SELECT tend FROM tanggal WHERE id=1))
group by namaoutlet
order by namadokter) 
)a

order by namadokter

当前查询结果

行号(row_num)医生姓名(namadokter)门店名称(namaoutlet)药品种类数(jenis_obat)总账单金额合计(sum(totaltagihan))
1richard chandra spkfa22500
2richard chandra spbkfb21500
3agus hidayat spkfa23000
4agus hidayat spkfb25000

当前查询可正常运行,但当需要UNION 30个及以上SELECT语句时,查询耗时显著增加。我推测原因是每个带通配符的SELECT都会单独执行一次查询,请问是否可以将其改写为单条SELECT语句以优化性能?


优化方案

可以把多个UNION的查询合并成单条语句,核心是用OR组合多个LIKE条件,同时修正分组逻辑确保结果与原查询一致。

优化后的SQL语句

SELECT  
    namadokter,
    namaoutlet,
    COUNT(notransaksi) AS jenis_obat,
    SUM(totaltagihan) AS sum_totaltagihan,
    ROW_NUMBER() OVER(ORDER BY namadokter) row_num
FROM laporandokterunitsurabaya
WHERE 
    (namadokter LIKE '%richard chandra%' OR namadokter LIKE '%agus hidayat%')
    AND tanggalresep BETWEEN (SELECT tstart FROM tanggal WHERE id=1) AND (SELECT tend FROM tanggal WHERE id=1)
GROUP BY namadokter, namaoutlet
ORDER BY namadokter

关键优化点

  • 合并查询条件:用OR替代多段独立查询的UNION,让数据库仅扫描一次表,避免重复扫描带来的性能损耗。
  • 修正分组逻辑:原查询中仅GROUP BY namaoutlet却选择namadokter,在严格SQL模式下会报错,优化后改为GROUP BY namadokter, namaoutlet,确保逻辑合规且结果准确。
  • 简化查询层级:去掉嵌套子查询与UNION结构,直接在主查询中计算行号,降低查询复杂度。

如果有30个医生姓名需要匹配,只需在OR后继续追加namadokter LIKE '%xxx%'条件即可,无需新增独立查询。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 04:22:01