2013-01-08 56 views
2

我有一些懷疑與SUM()函數在MySQL中。當我使用沒有條件的SUM()函數時會正常工作。但是,如果我將使用條件SUM()函數它將返回匹配條件的記錄數。向我解釋這一點。mysql總和功能問題

我被創建了一個表老師有四列如下。

mysql> desc Teacher; 


+--------------+-------------+------+-----+-------------------+ 
| Field  | Type  | Null | Key | Default   | 
+--------------+-------------+------+-----+-------------------+ 
| TeacherId | varchar(36) | NO | PRI | NULL    | 
| FirstName | varchar(50) | NO |  | NULL    | 
| LastName  | varchar(50) | NO |  | NULL    | 
| SyncStatus | int(11)  | NO |  | NULL    | 
+--------------+-------------+------+-----+-------------------+ 

它包含以下記錄。

mysql> select * from Teacher; 

+-----------+-----------+-----------+------------+ 
| TeacherId | FirstName | LastName | SyncStatus | 
+-----------+-----------+-----------+------------+ 
| 001  | Sagar  | Kapadia |   1 | 
| 002  | Vishal | Chaudhari |   1 | 
| 003  | Milan  | Panchal |   1 | 
| 004  | Jugal  | Desai  |   1 | 
| 005  | Baburao | Apte  |   1 | 
| 006  | Jaya  | Bacchan |   0 | 
| 007  | Jaya  | Bacchan |   2 | 
| 008  | Jaya  | Bacchan |   2 | 
+-----------+-----------+-----------+------------+ 
8 rows in set (0.00 sec) 




mysql> select TeacherId,FirstName,LastName,Concat(FirstName,' ',LastName) as FullName,SUM(SyncStatus) from Teacher having FullName like '_____ %'; 
+-----------+-----------+----------+---------------+-----------------+ 
| TeacherId | FIrstName | LastName | FullName  | sum(SyncStatus) | 
+-----------+-----------+----------+---------------+-----------------+ 
| 001  | Sagar  | Kapadia | Sagar Kapadia |    9 | 
+-----------+-----------+----------+---------------+-----------------+ 
1 row in set (0.00 sec) 

那麼它將返回我的同步狀態完美的總和。但是,如果我將使用條件SUM()然後returen記錄的數量。

mysql> select TeacherId,FIrstName,LastName,Concat(FirstName,' ',LastName) as FullName,sum(SyncStatus = 0) from Teacher having FullName like '_____ %'; 
+-----------+-----------+----------+---------------+---------------------+ 
| TeacherId | FIrstName | LastName | FullName  | sum(SyncStatus = 0) | 
+-----------+-----------+----------+---------------+---------------------+ 
| 001  | Sagar  | Kapadia | Sagar Kapadia |     1 | 
+-----------+-----------+----------+---------------+---------------------+ 
1 row in set (0.00 sec) 



mysql> select TeacherId,FIrstName,LastName,Concat(FirstName,' ',LastName) as FullName,sum(SyncStatus = 1) from Teacher having FullName like '_____ %'; 
+-----------+-----------+----------+---------------+---------------------+ 
| TeacherId | FIrstName | LastName | FullName  | sum(SyncStatus = 1) | 
+-----------+-----------+----------+---------------+---------------------+ 
| 001  | Sagar  | Kapadia | Sagar Kapadia |     5 | 
+-----------+-----------+----------+---------------+---------------------+ 
1 row in set (0.00 sec) 



mysql> select TeacherId,FIrstName,LastName,Concat(FirstName,' ',LastName) as FullName,sum(SyncStatus = 2) from Teacher having FullName like '_____ %'; 
+-----------+-----------+----------+---------------+---------------------+ 
| TeacherId | FIrstName | LastName | FullName  | sum(SyncStatus = 2) | 
+-----------+-----------+----------+---------------+---------------------+ 
| 001  | Sagar  | Kapadia | Sagar Kapadia |     2 | 
+-----------+-----------+----------+---------------+---------------------+ 
1 row in set (0.00 sec) 

回答

3

你說得對。此功能sum(SyncStatus = 2)將返回的行數,因爲這是它是如何執行

在每一行SyncStatus = 2將測試如果SyncStatus equals 2,並返回1(true) or 0(false),所以你基本上得到真值的總和(1)

+0

謝謝@Ankur。我現在明白SUM()函數將如何執行。再一次感謝你...... – milanpanchal

+0

剛剛遇到了這種確切的事情 - 它看起來像是在做我想做的事(在一個月內使用SUM返回一個動作完成的次數(確認= 1 )'帶'GROUP BY'),但我不確定這是它應該做的事 - 現在我知道了:) – CD001