2013-02-02 99 views
1

我解决了一个问题并且遇到了另一个问题。基本我想选择question_id,答案和最大发生次数。我从基本表运行我的查询,收集问题和答案(问题ID表示问题和答案表示答案从0到5对应于其他表,但无所谓)。选择最大值时的id和值

**survey_result** 
question_id 
answer (int from 0 to 5) 

样品survey_result:

question_id answer 
1   3 
1   5 
1   2 
2   2 
2   0 
2   4 

这里的查询,它的目的是检查每一个问题,它的答案(0-5)发生最多。

select question_id, answer, max(occurence_number) FROM 
(select question_id, answer, count(*) as occurence_number 
from survey_result 
group by question_id, answer 
order by question_id asc, occurence_number desc) as results 
GROUP BY question_id 

所以一个子查询结果是这样的:

question_id answer occurence_number 
1   0  12 
1   1  20 
1   2  34 
1   3  5 
1   4  9 
1   5  15 

但主要的查询结果是这样的:

question_id answer occurence_number 
1   0  12 
2   0  20 
3   0  34 
4   0  5 

所以问题是,它总是显示答案0,我想要得到正确的答案号码。

+1

发生这种情况是因为MySQL(与其他RDBMS不同)允许您将列放置在“SELECT”列表中,而这些列不在“GROUP BY”中。这会产生其他列的非确定性结果。 –

+0

你能更好地解释一下你希望得到的答案吗? –

+0

由于@MichaelBerkowski刚刚发表评论,该查询并不完全正确。你能添加一些样本值和期望的结果吗? –

回答

2

可悲的是有点多余,由于MySQL的缺乏WITH说法,但这应该做你想做的。如果平局,它将返回更高的答案。

SELECT s1.question_id, MAX(s1.answer) answer, MAX(s1.c) occurrences 
FROM 
    (SELECT question_id, answer, COUNT(*) c 
    FROM survey_result GROUP BY question_id,answer) s1 
LEFT JOIN 
    (SELECT question_id, answer, COUNT(*) c 
    FROM survey_result GROUP BY question_id,answer) s2 
    ON s1.question_id=s2.question_id 
AND s1.c < s2.c 
WHERE s2.c IS NULL 
GROUP BY question_id 

An SQLfiddle to play with

+0

嘿,我不想选择MAX的答案(答案编号表示答案值),这些值总是从0到5,所以使用最大答案总是会返回5 – Malyo

+0

@Malyo它会得到正确的答案,但如果答案3和4都有44票,它会选择4作为获胜者。如果3得到44,4得到42,就会像你说的那样选择3. –

+0

这个工作很完美。我仍然有麻烦完全理解代码,但它的工作原理,我非常感谢。 – Malyo

0

我认为你是它过于复杂,试试这个:

select question_id, answer, count(*) as occurence_number 
from survey_result 
group by question_id, answer 
+0

这是不正确的我的朋友。每个ID都有很多答案。我需要统计他们全部,然后为每个问题_id我需要选择答案和出现次数,其中最大发生次数(对于特定ID) – Malyo