# conversion overview mysql8 compatibility ## Goal 修复 `adminapi/stats.conversion/overview` 在数据库切换到 MySQL 8.0 后的 SQL 不兼容问题,并在不引入缓存的前提下优化该方法中的慢查询,保证 `dimension=dept` 与 `include_filters=1` 场景可正常且更快地查询。 ## What I already know * 主逻辑在 `server/app/adminapi/logic/stats/ConversionLogic.php` * 运行日志里已有一条 MySQL 语法错误记录: `SQLSTATE[42000]: Syntax error or access violation: 1064 ... near '( q.follow_admin_ids, '$[*]' COLUMNS (...)'` * 当前 `ConversionLogic.php` 已不再包含 `JSON_TABLE`,说明兼容修复可能做过一半,仍需核对当前文件中的 MySQL 8 风险点 * 当前文件仍有多处 `fieldRaw + group` 聚合查询,MySQL 8 默认 `ONLY_FULL_GROUP_BY` 更严格,需要重点检查 * 当前文件使用了表名 `order`、`whereRaw`、多处左连接与聚合,均可能触发 MySQL 8 兼容性问题 * 历史运行日志显示慢点主要集中在: * `hydrateFanStats`,多次达到 `0.7s ~ 2.4s` * `include_filters=1` 时的 `buildFilterOptions -> DiagnosisLogic::getAssistants`,曾到 `18s+` ## Assumptions (temporary) * 当前用户提到的“不兼容”针对的是 `stats.conversion/overview` 当前版本,不要求顺带修复其他统计模块 * 优先修复服务端 SQL 兼容性,并优化 SQL 结构,不改接口出参结构 * 若发现旧版遗留的 JSON_TABLE 逻辑已被替换,则以当前代码中的聚合、NULL 比较、保留字、原生 SQL 片段为修复重点 ## Open Questions * 无。已有日志和代码足够开始修复。 ## Requirements * 审查并修复 `ConversionLogic.php` 中 MySQL 8.0 不兼容 SQL * 保证 `overview?page_no=1&page_size=15&dimension=dept&media_channel_code=&time_type=today&include_filters=1` 可执行 * 优化该接口中的主要慢 SQL,重点关注 `hydrateFanStats` 和 `include_filters=1` 时的筛选项查询 * 避免引入新的统计口径变化 * 尽量将原生 SQL 改为更稳定的 Builder 写法,或改成 MySQL 8 兼容表达式 ## Acceptance Criteria * [ ] `ConversionLogic` 中不再包含已知 MySQL 8 不兼容写法 * [ ] 关键聚合查询在 MySQL 8 的 `ONLY_FULL_GROUP_BY` 下可通过 * [ ] 至少一个已知慢点的 SQL 结构得到收敛优化 * [ ] 不改变现有接口结构和主要业务语义 * [ ] 至少完成 PHP 语法检查 ## Out of Scope * 其他统计模块(如 `YejiStatsLogic`、`DoctorDailyStatsLogic`)的整体兼容性修复 * 前端页面样式或交互修改 ## Technical Notes * 目标文件:`server/app/adminapi/logic/stats/ConversionLogic.php` * 参考日志:`server/runtime/adminapi/log/202604/22.log` ## Research References * [`research/current-findings.md`](research/current-findings.md) — 当前代码与历史报错线索