利用MySQL統計一列中不同值的數量方法示例


前言

本文實現的這個需求其實十分普遍,舉例來說,我們存在一個用戶來源表,用來標記用戶從哪個渠道注冊進來。表結構如下所示…

其中 origin 是用戶來源,其中的值有 iPhone 、Android 、Web 三種,現在需要分別統計由這三種渠道注冊的用戶數量。

解決方案1

?
1
2
3
4
5
6
7
8
9
SELECT count (*)
FROM user_operation_log
WHERE origin = 'iPhone' ;
SELECT count (*)
FROM user_operation_log
WHERE origin = 'Android' ;
SELECT count (*)
FROM user_operation_log
WHERE origin = 'Web' ;

用 where 語句分別統計各自的數量。

這樣查詢的量有點多了,如果這個值有 10 個呢,那還得寫 10 條相似的語句,很麻煩。

有沒有一條語句就搞定的呢?於是去查了些資料。

解決方案2

我們知道 count 不僅可以用來統計行數,也能統計列值的數量,例如:

統計 user_operation_log 有多少行:

?
1
SELECT count (*) FROM user_operation_log

統計 origin 這列值不為 NULL 的數量:

?
1
SELECT count (origin) FROM user_operation_log

所以我們可以利用這個特性來實現上面的需求

第一種寫法(用 count 實現)

?
1
2
3
4
5
SELECT
  count (origin = 'iPhone' OR NULL ) AS iPhone,
  count (origin = 'Android' OR NULL ) AS Android,
  count (origin = 'Web' OR NULL AS Web
FROM user_operation_log;

查詢結果

第二種寫法(用 sum 實現)

?
1
2
3
4
5
SELECT
  sum (if(origin = 'iPhone' , 1, 0)) AS iPhone,
  sum (if(origin = 'Android' , 1, 0)) AS Android,
  sum (if(origin = 'Web' , 1, 0))  AS Web
FROM user_operation_log;

查詢結果

第三種寫法(改寫 sum)

?
1
2
3
4
5
SELECT
  sum (origin = 'iPhone' ) AS iPhone,
  sum (origin = 'Android' ) AS Android,
  sum (origin = 'Web' AS Web
FROM user_operation_log;

查詢結果

第四種寫法(來自掘金用戶 傑夫 的答案)

?
1
SELECT origin, count (*) num FROM user_operation_log GROUP BY origin;

查詢結果

至此,已經達到了我們的需求。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM