SELECT *
让我选择给定表格的所有字段。当我不知道所有或字段的名称时,或者当我不想修复有问题的查询时(为了允许表更改的灵活性),我使用它。
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(*)
之类的东西 - 但这会引起语法错误。
也许我可以以某种方式使用信息架构?或者有更简单的方法吗?
答案 0 :(得分:0)
是的,您可以使用信息架构。也就是说,即使有可能,但这并不意味着它是个好主意。
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
类型的列。将其更改为处理其他列类型非常简单。