2015-04-01 39 views
1

我在表中有3個字段num1num2,num3mysql中的自動求和

我需要這三個在另一個字段avgNum的平均值。

用戶只使用插入查詢插入值num1,num2,num3

有可能嗎?

+1

你的意思是類似'SELECT(num1 + num2 + num3)/ 3 AS avgNum FROM ...'? – 2015-04-01 07:26:07

+0

是的。如果我改變num2的值自動平均必須改變。 – Sona 2015-04-01 07:31:02

+1

您是否熟悉視圖(http://www.w3schools.com/sql/sql_view.asp)? – 2015-04-01 07:39:07

回答

1

您可以創建一個觸發器,像這樣:

CREATE TRIGGER `new_table_BEFORE_INSERT` 
BEFORE INSERT ON `new_table` 
FOR EACH ROW 
set NEW.avgnum = (NEW.num1+NEW.num2+NEW.num3)/3 
0

的Gabor的答案是正確的 - 你似乎需要一個簡單的數學運算,而不是SQL函數SUMAVERAGE

SELECT (num1 + num2 + num3)/3 AS avgNum FROM table_name 

不管怎樣,我建議你閱讀有關數據庫設計的3rd normal form並相應地更改您的表格結構,因爲想想您將必須如何處理:

  1. 存儲另一個數字 - 您會添加另一列num4
  2. 找到所有已1和100之間的數字記錄,你將不得不使用複雜OR條款,而不是簡單的JOIN
+0

我有20 - 30列從不同的形式插入。這個平均值正在考慮另一個等式 – Sona 2015-04-01 07:59:21

1

如果你需要的東西,而插入和更新,以實現自動化,你可能需要使用觸發器

  • 一個插入前計算平均值。
  • 更新前一個並計算平均值。

這裏有兩個觸發需要

delimiter // 

create trigger cal_average_on_insert before insert on test 
for each row 
begin 
set new.avgnum = (new.num1+new.num2+new.num3)/3 ; 
end;// 

delimiter ; 


delimiter // 

create trigger cal_average_on_uodate before update on test 
for each row 
begin 
set new.avgnum = (new.num1+new.num2+new.num3)/3 ; 
end;// 

delimiter ; 

在這裏,您可以更改表名和字段名是一個測試用例在MySQL CLI

mysql> create table test (id int, num1 int, num2 int, num3 int, avgnum float(10,2)); 
Query OK, 0 rows affected (0.11 sec) 


mysql> delimiter // 
mysql> 
mysql> create trigger cal_average_on_insert before insert on test 
    -> for each row 
    -> begin 
    -> set new.avgnum = (new.num1+new.num2+new.num3)/3 ; 
    -> end;// 
Query OK, 0 rows affected (0.09 sec) 

mysql> 
mysql> delimiter ; 
mysql> delimiter // 
mysql> 
mysql> create trigger cal_average_on_uodate before update on test 
    -> for each row 
    -> begin 
    -> set new.avgnum = (new.num1+new.num2+new.num3)/3 ; 
    -> end;// 
Query OK, 0 rows affected (0.15 sec) 

mysql> insert into test (id,num1,num2,num3) values (1,10,20,30); 
Query OK, 1 row affected (0.04 sec) 

mysql> insert into test (id,num1,num2,num3) values (2,30,40,50); 
Query OK, 1 row affected (0.04 sec) 

mysql> select * from test ; 
+------+------+------+------+--------+ 
| id | num1 | num2 | num3 | avgnum | 
+------+------+------+------+--------+ 
| 1 | 10 | 20 | 30 | 20.00 | 
| 2 | 30 | 40 | 50 | 40.00 | 
+------+------+------+------+--------+ 
2 rows in set (0.00 sec) 

mysql> update test set num1=30, num2=50 where id=1 ; 
Query OK, 1 row affected (0.11 sec) 
Rows matched: 1 Changed: 1 Warnings: 0 

mysql> select * from test ; 
+------+------+------+------+--------+ 
| id | num1 | num2 | num3 | avgnum | 
+------+------+------+------+--------+ 
| 1 | 30 | 50 | 30 | 36.67 | 
| 2 | 30 | 40 | 50 | 40.00 | 
+------+------+------+------+--------+ 
2 rows in set (0.00 sec)