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

如何在PHP中简洁实现MySQL所有red开头列的求和?

问题

我的数据库表中有red1、green1、red2、green2……red1623、green1623这类列,希望在PHP中对所有以red开头的列进行求和,但不想编写如下冗长代码:

SELECT SUM(red1) + SUM(red2) + .... + SUM(red1623)

我找到了一段MySQL代码但无法理解,需要PHP版本的实现代码:

SET @colname = (SELECT GROUP_CONCAT(`column_name`) from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='dnevnik' AND `column_name` LIKE 'redovno%');
SET @table = '1';
SET @query = CONCAT('SELECT SUM(',@colname,') FROM ', @table);
PREPARE stmt FROM @query;
EXECUTE stmt;
代码解释与PHP实现

先解释你找到的MySQL代码逻辑

这段代码的核心是动态生成SQL语句来避免手动枚举所有列名,步骤如下:

  1. 从系统表INFORMATION_SCHEMA.COLUMNS中,查询目标表(示例中是dnevnik)里所有以redovno开头的列名,用GROUP_CONCAT把列名拼成逗号分隔的字符串
  2. 定义要查询的表名(示例里的'1'明显是笔误,需要替换成实际表名)
  3. 拼接查询语句,但原代码有语法错误:SUM(列1,列2...)是无效写法,正确的求和逻辑应该是SUM(列1)+SUM(列2)+...
  4. 预处理并执行拼接好的动态SQL

PHP版本实现(以PDO为例)

下面是适配你需求(求和所有red开头的列)的PHP代码,记得替换成自己的数据库连接信息:

<?php
// 数据库连接配置
$dbHost = '你的数据库主机地址';
$dbName = '你的数据库名称';
$dbUser = '数据库用户名';
$dbPass = '数据库密码';

try {
    // 初始化PDO连接
    $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 1. 查询所有以red开头的列,并拼接成SUM(列名)的格式
    $tableName = '你的实际表名';
    $stmt = $pdo->prepare("SELECT GROUP_CONCAT(CONCAT('SUM(', `column_name`, ')')) as sum_columns 
                          FROM INFORMATION_SCHEMA.COLUMNS 
                          WHERE TABLE_SCHEMA = :dbName 
                          AND TABLE_NAME = :tableName 
                          AND `column_name` LIKE 'red%'");
    $stmt->bindParam(':dbName', $dbName);
    $stmt->bindParam(':tableName', $tableName);
    $stmt->execute();
    $result = $stmt->fetch(PDO::FETCH_ASSOC);
    $sumColumns = $result['sum_columns'];

    if (!$sumColumns) {
        echo "未找到以red开头的列";
        exit;
    }

    // 2. 执行求和查询
    $sql = "SELECT $sumColumns AS total_sum FROM $tableName";
    $stmt = $pdo->prepare($sql);
    $stmt->execute();
    $total = $stmt->fetch(PDO::FETCH_ASSOC)['total_sum'];

    echo "所有red开头列的总和为:$total";

} catch(PDOException $e) {
    die("数据库错误: " . $e->getMessage());
}
?>

关键说明

  • 用CONCAT('SUM(', column_name, ')')把每个列名转换成SUM(red1)的形式,再通过GROUP_CONCAT自动拼接成SUM(red1)+SUM(red2)+...的字符串
  • 加入TABLE_SCHEMA = :dbName条件,避免不同数据库下重名表的干扰
  • 包含异常处理逻辑,方便排查连接或SQL错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:23:10