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

如何使用单条查询统计两表指定行数 优化现有多查询PHP代码

单SQL合并统计方案

核心SQL语句

可以通过条件聚合+子查询的方式,把4次查询合并为1次,两种常用写法均可:

写法1(条件聚合,性能更优)

仅扫描一次edev_useri表即可得到所有同表统计值:

SELECT 
  (SELECT COUNT(*) FROM edev_useri) AS useri,
  COUNT(CASE WHEN groupid = 6 THEN 1 END) AS dev,
  COUNT(CASE WHEN groupid = 7 THEN 1 END) AS ben,
  (SELECT COUNT(*) FROM edev_cereri) AS cereri
FROM edev_useri

写法2(全子查询,逻辑更直观)

无需依赖外层表,即使edev_useri是空表也能正常返回结果:

SELECT
  (SELECT COUNT(*) FROM edev_useri) AS useri,
  (SELECT COUNT(*) FROM edev_useri WHERE groupid = 6) AS dev,
  (SELECT COUNT(*) FROM edev_useri WHERE groupid = 7) AS ben,
  (SELECT COUNT(*) FROM edev_cereri) AS cereri

修改后的PHP代码

替换原有多查询逻辑即可,输出结构和原有逻辑完全一致:

// 选择上述任意一种SQL语句执行即可
$res = $db->query("
SELECT
  (SELECT COUNT(*) FROM edev_useri) AS useri,
  (SELECT COUNT(*) FROM edev_useri WHERE groupid = 6) AS dev,
  (SELECT COUNT(*) FROM edev_useri WHERE groupid = 7) AS ben,
  (SELECT COUNT(*) FROM edev_cereri) AS cereri
");
// 根据实际使用的数据库操作类调整取单行数据的方法,fetchAssoc/fetchRow等均可
$stats = $db->fetchAssoc($res);

$dashStats = [
    'useri' => (int)$stats['useri'],
    'dev' => (int)$stats['dev'],
    'ben' => (int)$stats['ben'],
    'cereri' => (int)$stats['cereri']
];
$json_data = ['dashStats' => [$dashStats]];
echo json_encode($json_data);

逻辑说明

  • 所有统计逻辑和原有多查询实现完全一致,没有结果偏差
  • 仅需一次数据库交互,比原有实现减少了3次连接开销,性能更优
  • 统计结果自动转为int类型,避免JSON输出时出现字符串类型的数值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:54:03