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

其中 origin 是用戶來源,其中的值有 iPhone 、Android 、Web 三種,現在需要分別統計由這三種渠道注冊的用戶數量。
解決方案1
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 有多少行:
SELECT count(*) FROM user_operation_log
統計 origin 這列值不為 NULL 的數量:
SELECT count(origin) FROM user_operation_log
所以我們可以利用這個特性來實現上面的需求
第一種寫法(用 count 實現)
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 實現)
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)
SELECT
sum(origin = 'iPhone') AS iPhone,
sum(origin = 'Android') AS Android,
sum(origin = 'Web') AS Web
FROM user_operation_log;
查詢結果

第四種寫法(來自掘金用戶 杰夫 的答案)
SELECT origin,count(*) num FROM user_operation_log GROUP BY origin;
查詢結果

至此,已經達到了我們的需求。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
您可能感興趣的文章:- mysql 行轉列和列轉行實例詳解
- MYSQL數據庫中的現有表增加新字段(列)
- mysql簡單實現查詢結果添加序列號的方法
- 如何使用MySQL查詢某個列中相同值的數量統計
- Mysql中返回一個數據庫的所有表名,列名數據類型備注
- MySQL 添加、修改、刪除表的列及約束等表的定義
- 數據庫實現行列轉換(mysql示例)
- MySQL存儲過程中使用動態行轉列
- mysql 列轉行,合并字段的方法(必看)
- mysql 將列值轉變為列的方法
- mysql5.7 生成列 generated column用法實例分析