SELECT *
让我选择给定表的所有字段。当我不知道所有字段或字段的名称,或者当我不想修复有问题的查询(以允许在表更改方面具有灵 active )时,我会使用它。
SELECT SUM(col)
让我计算表中特定列的总和,我知道其字段名称。
我能以某种方式将两者结合起来吗?
例如,如果 SELECT * FROM TestTable
返回以下内容:
+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
| 1 | 2 | 3 |
| 2 | 3 | 4 |
| 3 | 4 | 5 |
+------+------+------+
然后我希望得到如下输出:
+-----------+-----------+-----------+
| SUM(col1) | SUM(col2) | SUM(col3) |
+-----------+-----------+-----------+
| 6 | 9 | 12 |
+-----------+-----------+-----------+
不在查询中使用字段名称col1
、col2
或col3
(当然,标题行可以是任何其他内容)。类似 SELECT SUM(*)
的东西——但这会引发语法错误。
也许我可以以某种方式使用信息模式?或者有没有更简单的方法?
最佳答案
是的,您可以为此使用信息模式。也就是说,即使某些事情是可能的,也不意味着它就是一个好主意。
delimiter $$
CREATE PROCEDURE colsum( tbl char(32))
BEGIN
DECLARE cur1_eof INT DEFAULT FALSE;
DECLARE cname CHAR(128);
DECLARE cur1 CURSOR FOR SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema=database() AND table_name=tbl AND data_type="int";
DECLARE CONTINUE HANDLER FOR NOT FOUND SET cur1_eof = TRUE;
SELECT '' INTO @qs;
OPEN cur1;
cols: LOOP
FETCH cur1 INTO cname;
IF cur1_eof THEN
LEAVE cols;
END IF;
SELECT CONCAT(@qs,IF(length(@qs)>0,',',''),'SUM(',cname,') AS ',cname) INTO @qs;
END LOOP;
CLOSE cur1;
SELECT CONCAT('SELECT ',@qs,' FROM ',tbl,';') INTO @qs;
PREPARE s1 FROM @qs;
EXECUTE s1;
DEALLOCATE PREPARE s1;
END
$$
delimiter ;
然后您可以使用 call colsum('your_table');
来获得预期的列总和。上面的示例仅列出类型为 INT
的列。更改它以处理其他列类型相当简单。
关于mysql - 对未知数量的字段求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22403315/