天天看點

利用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 有多少行:

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;

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

總結

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