2013-02-02 133 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