2013-10-23 55 views
0

使用MySQL。我有一个表,看起来像这样:选择MySQL中多个字段的值出现次数

rawID | a1a | a1b | a2a | a2b | a2c | ... 
    1 | 2 | 0 | 0 | 0 | 2 | ... 
    2 | 2 | 2 | 0 | 0 | 0 | ... 
    3 | 0 | 1 | 1 | 1 | 2 | ... 
    4 | 2 | 1 | 2 | 1 | 2 | ... 

*为字段的可能值在一个单独的“响应”表和预定义的范围从0-2。

我想要一个结果,让我每个字段的每个值的出现。我已经看到类似的问题,但只处理一个领域。

我想我的结果是这样的:

response | a1a | a1b | a2a | a2b | a2c | ... 
     0  | 1 | 1 | 2 | 2 | 1 | ... 
     1  | 0 | 2 | 1 | 2 | 0 | ... 
     2  | 3 | 1 | 1 | 0 | 3 | ... 

此表有次,每次值(“回应”)的数量发生了每个字段。

谢谢你们,

+0

您是否有明确的列表或可能的响应(0,1,2)在哪里定义?否则,我们需要一个'SELECT 0 UNION SELECT 1 UNION SELECT 2'来启动它,或者更糟的是:如果它可能发生变化,并且我们应该列出动态值,那么我们必须从'SELECT DISTINCT a1a FROM表UNION SELECT DISTINCT a1b ......'等 – Wrikken

+0

这不是一个编程问题。它似乎并没有表现出你自己解决问题的最小努力。如果您需要解决这些问题,请聘请顾问或程序员。这不是救世军。 – mwhs

+0

@Wrikken - 是的,可能的答案是在一个单独的表中定义 – thequeue

回答

1

尝试了这一点:

SELECT 
    response, 
    sum(a1a = response) a1aCount, 
    sum(a1b = response) a1bCount, 
    sum(a2a = response) a2aCount, 
    sum(a2b = response) a2bCount, 
    sum(a2c = response) a2cCount 
FROM t, r 
GROUP BY response 

输出:

| RESPONSE | A1ACOUNT | A1BCOUNT | A2ACOUNT | A2BCOUNT | A2CCOUNT | 
|----------|----------|----------|----------|----------|----------| 
|  0 |  1 |  1 |  2 |  2 |  1 | 
|  1 |  0 |  2 |  1 |  2 |  0 | 
|  2 |  3 |  1 |  1 |  0 |  3 | 

F iddle here

无论response表中的项目数量如何,这都可以工作。

+1

美丽。完美的作品。谢谢一堆! – thequeue

0

我想这应该作品(我们假设你的表名是 “答复”):

SELECT 0 as response, SUM(r.a1a = 0) as a1a, SUM(r.a1b = 0) as a1b, 
SUM(r.a2a = 0) as a2a, SUM(r.a2b = 0) as a2b FROM responses r 
UNION 
SELECT 1 as response, SUM(r.a1a = 1) as a1a, SUM(r.a1b = 1) as a1b, 
SUM(r.a2a = 1) as a2a, SUM(r.a2b = 1) as a2b FROM responses r 
UNION 
SELECT 2 as response, SUM(r.a1a = 2) as a1a, SUM(r.a1b = 2) as a1b,  
SUM(r.a2a = 2) as a2a, SUM(r.a2b = 2) as a2b FROM responses r