查询是否可能没有现有的组值但是为其行返回null?

时间:2014-09-11 07:24:03

标签: mysql sql

我试图进行民意调查,首先这是我的表格

PollTable

[pid][title][choices]

选择是动态的,至少需要2个选项,它是用分隔符构建的

示例:

'Apple|Grape|Banana'

另一个表是我存储用户响应的响应表

[pid][uid][answer]

示例数据:

1-1-1 //where pid - uid - answer
1-2-1
1-3-2
1-4-3
1-5-3

使用此查询,我可以获得每个答案的响应数

SELECT `answer`, COUNT(`answer`) as 'response' 
FROM `poll_response` WHERE `pid` = 1 GROUP BY `answer`

结果

[ answer ][ response ]
[    1   ][     2    ]
[    2   ][     1    ]
[    3   ][     2    ]

除非某个选择没有受访者,否则效果很好

示例:

1-1-1
1-2-1
1-3-1
1-4-3
1-5-3

这会给我

[ answer ][ response ]
[    1   ][     3    ]
[    3   ][     2    ]

但我需要的是

[ answer ][ response ]
[    1   ][     3    ]
[    2   ][     0 or null    ]
[    3   ][     2    ]

我知道如果每个选项都有自己的列,可以通过LEFT JOIN到POLL表来完成,但是再次选择是动态的,它可以是10个以上或任何X.

是否可以使用当前设置?任何想法?

2 个答案:

答案 0 :(得分:1)

您的问题中有两个有趣的问题。一个是如何确定选择的数量,另一个是如何生成一系列数字而不创建一个表格,你可以用它来找到"缺少"答案。

首先,一些字符串操作可以帮助你。如果分隔符总是" |"然后表达式length(choices)-length(replace(choices,"|",""))+1为您提供投票的选择数量。

关于第二个问题,可能有一种使用内联变量(@row等)来生成序列的方法,但是在你有一个有限的最大选择集的情况下,一种更简单的方法可能是一个简单的联合,例如,select 1 as counter union select 2 union select 3 union select 4 union select 5的行。

结合上述内容,从响应表中查找未接收到not exists答案的序列中的项目。使用字符串表达式将序列中的项限制为小于给定轮询可用的最大选项数。例如:

select counter as answer, 0 as response
from polltable p,
  (select 1 as counter union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) as options
where p.pid=1
  and not exists (
    select answer from response r
    where r.pid=1
      and answer=counter)
  and counter<=length(choices)-length(replace(choices,"|",""))+1

最后,将具有已回答选项的初始查询与上述联合起来。这是一个示例sql fiddle

答案 1 :(得分:0)

我认为这是不可能的......

但您如何看待使用javascript的这种方法?合理吗?

数据传递给json所以

我做了这个

choices = data[0]['choices'].split('|'); //Where data is the SELECT * for the Poll Table

现在有

["Apple" , "Grape", "Banana"]

现在我这样做是为响应制作一个容器

var response = new Array( choices.length+1 ).join('0').split('').map(parseFloat);

[ 0, 0, 0 ]

并进入此循环

    for( x=0; x<responsedata.length; x++ ){
        response[ parseInt( responsedata[x]['answer']-1 ) ] = parseInt( responsedata[x]['response'] );

        //Where responsedata is the result of
        //SELECT `answer`, COUNT(`answer`) as 'response' 
        //FROM `poll_response` WHERE `pid` = 1 GROUP BY `answer`
    }

所以我现在在响应数组中有这个

[3, 0, 2]