mysql计算在多个列中显示相同值的次数

时间:2018-02-02 23:32:06

标签: php mysql sql count

在小组项目期间,我们最近发送了一份关于我们正在建设的网站的调查。我已将数据放入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

非常感谢任何帮助

3 个答案:

答案 0 :(得分: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;

我认为没有理由重复这个值三次。

答案 1 :(得分:1)

使用具有不同值的合成表,并将其与获得每个分数计数的子查询联系起来。

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

DEMO

答案 2 :(得分:0)

以下是三种方式:

has_many :answers_projects
has_many :projects, through: :answers_projects

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 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/4

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/5

他们都返回相同的结果:

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

@futureweb在评论中写道,我没有理由重复三次得分。虽然你可以使用别名。

如果您有数百万行;-)而且没有索引,您只希望通过一次表扫描获得结果。这可以通过以下方式实现:

| 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 |

这将返回您需要的数据,但不会返回您想要的数据:

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

所以你需要发布它。