簡體   English   中英

mysql計算同一值出現在多個列中的次數

[英]mysql count how many times the same value appears across multiple colums

在一個小組項目中,我們最近發布了一份有關我們正在建設的網站的調查。 我已經將數據放入mysql數據庫中,並且試圖找出如何計算每個類別中表給出的特定分數的次數。

+-----------------+--------------+-------------------+
| Design          | Ease of use  | Responsiveness    |
+-----------------+--------------+-------------------+
| 5               | 5            | 5
| 4               | 4            | 4
| 3               | 3            | 3
| 2               | 2            | 2
| 1               | 1            | 1
| 5               | 4            | 2
| 5               | 4            | 4
| 3               | 3            | 3
| 1               | 2            | 2
| 1               | 2            | 2

我發現一個查詢適用於一個列

SELECT Design, COUNT(*) AS num FROM table GROUP BY Design

然后我會得到

Design | num
------------- 
 5     | 3
 4     | 1
 3     | 2
 2     | 1  
 1     | 3

如果我要嘗試

SELECT Design, COUNT(*) AS num1, Ease of use, COUNT(*) as num2 FROM table 
GROUP BY Design, Ease of use

桌子完全搞砸了。

我想要得到的是

Design | num1 | Ease of use  | num2 | Responsiveness | num3 
------------- --------------------------------------------------
 5     | 3    | 5            | 1    | 5              | 1
 4     | 1    | 4            | 3    | 4              | 2
 3     | 2    | 3            | 2    | 3              | 2
 2     | 1    | 2            | 3    | 2              | 4
 1     | 3    | 1            | 1    | 1              | 1

任何幫助將不勝感激

您可以取消透視值,然后進行匯總。 在MySQL中,通常使用union all

select val, count(*)
from ((select design as val from table) union all
      (select ease_of_use from table) union all
      (select responsiveness from table
     ) der
group by val
order by val desc;

對於您想要獲得的,您可以執行以下操作:

select val, sum(design) as design, sum(ease_of_use) as ease_of_use,
       sum(responsiveness) as responsiveness
from ((select design as val, 1 as design, 0 as ease_of_use, 0 as responsiveness from table) union all
      (select ease_of_use, 0, 1, 0 from table) union all
      (select responsiveness, 0, 0, 1 from table
     ) der
group by val
order by val desc;

我認為沒有理由重復該值三次。

使用具有不同值的綜合表,並將此表與子查詢結合使用,以獲取每個分數的計數。

SELECT nums.num AS Design, t1.count AS num1,
       nums.num AS `Ease of Use`, t2.count AS num2,
       nums.num AS Responsiveness, t3.count AS num3
FROM (SELECT 1 AS num UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) AS nums
LEFT JOIN (
    SELECT Design, COUNT(*) AS count
    FROM yourTable
    GROUP BY Design) AS t1 ON t1.Design = nums.num
LEFT JOIN (
    SELECT `Ease of Use`, COUNT(*) AS count
    FROM yourTable
    GROUP BY `Ease of Use`) AS t2 ON t2.`Ease of Use` = nums.num
LEFT JOIN (
    SELECT Responsiveness, COUNT(*) AS count
    FROM yourTable
    GROUP BY Responsiveness) AS t3 ON t3.Responsiveness = nums.num

演示

這是三種方式:

select s.score,
  (select count(*) from tbl where `Design`         = s.score) as `Design`,
  (select count(*) from tbl where `Ease of use`    = s.score) as `Ease of use`,
  (select count(*) from tbl where `Responsiveness` = s.score) as `Responsiveness`
from (
  select Design as score from tbl
  union select `Ease of use` from tbl
  union select Responsiveness from tbl
) s
order by score desc

http://sqlfiddle.com/#!9/002303/2

select s.score,
  (select count(*) from tbl where `Design`         = s.score) as `Design`,
  (select count(*) from tbl where `Ease of use`    = s.score) as `Ease of use`,
  (select count(*) from tbl where `Responsiveness` = s.score) as `Responsiveness`
from (select 1 as score union select 2 union select 3 union select 4 union select 5) s
order by score desc

http://sqlfiddle.com/#!9/002303/4

select s.score,
  sum(`Design`         = score) as `Design`,
  sum(`Ease of use`    = score) as `Ease of use`,
  sum(`Responsiveness` = score) as `Responsiveness`
from (select 1 as score union select 2 union select 3 union select 4 union select 5) s
cross join tbl t
group by s.score
order by s.score desc

http://sqlfiddle.com/#!9/002303/5

它們都返回相同的結果:

| score | Design | Ease of use | Responsiveness |
|-------|--------|-------------|----------------|
|     5 |      3 |           1 |              1 |
|     4 |      1 |           3 |              2 |
|     3 |      2 |           2 |              2 |
|     2 |      1 |           3 |              4 |
|     1 |      3 |           1 |              1 |

正如@futureweb在評論中所寫,我沒有理由重復三遍。 雖然您可以使用別名。

如果您有數百萬行;-)並且沒有索引,則只希望通過一次表掃描就可以得到結果。 這可以通過以下方式實現:

select
  sum(`Design` = 1) as d1,
  sum(`Design` = 2) as d2,
  sum(`Design` = 3) as d3,
  sum(`Design` = 4) as d4,
  sum(`Design` = 5) as d5,
  sum(`Ease of use` = 1) as e1,
  sum(`Ease of use` = 2) as e2,
  sum(`Ease of use` = 3) as e3,
  sum(`Ease of use` = 4) as e4,
  sum(`Ease of use` = 5) as e5,
  sum(`Responsiveness` = 1) as r1,
  sum(`Responsiveness` = 2) as r2,
  sum(`Responsiveness` = 3) as r3,
  sum(`Responsiveness` = 4) as r4,
  sum(`Responsiveness` = 5) as r5
from tbl

這將返回您需要的數據,但不是您想要的形式:

| d1 | d2 | d3 | d4 | d5 | e1 | e2 | e3 | e4 | e5 | r1 | r2 | r3 | r4 | r5 |
|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|
|  3 |  1 |  2 |  1 |  3 |  1 |  3 |  2 |  3 |  1 |  1 |  4 |  2 |  2 |  1 |

因此,您需要對其進行后期處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM