如何在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语句来避免手动枚举所有列名,步骤如下:
- 从系统表
INFORMATION_SCHEMA.COLUMNS中,查询目标表(示例中是dnevnik)里所有以redovno开头的列名,用GROUP_CONCAT把列名拼成逗号分隔的字符串 - 定义要查询的表名(示例里的
'1'明显是笔误,需要替换成实际表名) - 拼接查询语句,但原代码有语法错误:
SUM(列1,列2...)是无效写法,正确的求和逻辑应该是SUM(列1)+SUM(列2)+... - 预处理并执行拼接好的动态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
相关产品推荐
相关产品推荐

