我有一个大约 100 列的 MySQL 表。所有列都是 INT。我希望能够通过其 ID 选择一行,并获得加在一起的所有列的总数。
还有两个额外的考虑。字段标题差异很大,因此我希望能够通过引用字段编号而不是字段标题来使其工作。
最后,我希望能够指定一个范围,例如,将字段 35 到字段 76 的总和相加,其中 id = 50。
有没有办法做到这一点?非常感谢你!
我有一个大约 100 列的 MySQL 表。所有列都是 INT。我希望能够通过其 ID 选择一行,并获得加在一起的所有列的总数。
还有两个额外的考虑。字段标题差异很大,因此我希望能够通过引用字段编号而不是字段标题来使其工作。
最后,我希望能够指定一个范围,例如,将字段 35 到字段 76 的总和相加,其中 id = 50。
有没有办法做到这一点?非常感谢你!
您需要动态构建查询。
首先你需要列名(你也可以自动检索它们,但需要一个额外的查询)。最好的办法是将它们放在一个数组中:
$Fields = array(
'id', 'fld2', 'fld3', ..., 'fld99'
);
function getSumField($from, $to, $allow_null = False)
{
GLOBAL $Fields;
$a_sum = array();
for($i = $from; $i <= $to; $i++)
{
if ($allow_null)
$a_sum[] = "COALESCE({$Fields[$i]},0)";
else
$a_sum[] = $Fields[$i];
}
return '('.implode('+', $a_sum).')';
}
// So we want: sum of fields 17-42 of the ONE ROW where ID = 5
$fld = getSumField(17, 42);
$SQL = "SELECT $fld FROM tbl WHERE id = 5;";
// Sum of same, in rows with ids from 7 to 22
$SQL = "SELECT SUM($fld) AS total FROM tbl WHERE id BETWEEN 7 AND 22;";
您可以使用 info_schema 获取列列表:
select * from information_schema.columns where table_name='table'
使用它,您可以构建一个列数组,进行查询并对值求和。它不是一个“一步”的过程,但它就足够了。