2012-07-31 120 views
3

我有两个表questionsansweredanswered包含所有用户的所有问题的答案。一位用户可以多次回答问题。一个问题可以被正确或不正确地回答。MySQL:通过查询获取组中的最新值

我在查找一个查询,它将返回一个类别中所有问题的正确答案和错误答案的计数。 尽管我只想使用最新的答案。因此,如果用户之前正确回答了相同的问题,并且正确地更近一些,我只想计算最新的 - 正确的 - 。

这是我走到这一步:

http://sqlfiddle.com/#!2/31e2e/2/0

SELECT a.correct, count(*) as count 
FROM answered a JOIN questions q ON a.question_id = q.id 
WHERE a.user_id = 1 AND q.category_id = 1 
GROUP BY correct 

它返回

| CORRECT | COUNT | 
----------------------- 
| 0  | 2  | 
----------------------- 
| 1  | 4  | 
----------------------- 

我要的是

| CORRECT | COUNT | 
----------------------- 
| 0  | 1  | 
----------------------- 
| 1  | 2  | 
----------------------- 
+0

是如何解答确定为当前或更早?有'datetime'列吗? – 2012-07-31 15:43:28

+0

是的,看看他发布的sqlfiddle.com页面:) – 2012-07-31 15:53:21

回答

2

下面是该查询你需要:

SELECT a.correct, count(*) as counter 
FROM answered a 
JOIN (SELECT user_id, question_id, max(created) as maxCreated 
     FROM answered 
     GROUP BY user_id, question_id) aux 
    ON a.user_id = aux.user_id AND 
    a.question_id = aux.question_id AND 
    a.created = aux.maxCreated 
JOIN questions q ON a.question_id = q.id 
WHERE a.user_id = 1 AND q.category_id = 1 
GROUP BY a.correct 

使用aux子查询与最后答案从给定用户问题只选择行。

+0

删除'as'maxCreated''和'as'counter''的引号。 – 2012-07-31 15:49:52

+0

@ypercube完成了,但为什么这是一个问题? – 2012-07-31 15:58:26

+0

单引号应该用于字符串文字,而不是列名或别名。这就是双引号(也是MySQL中的反引号)。 – 2012-07-31 16:07:38

1

如果你需要计算的唯一正确的答案时,他们会给出:

select b.correct, count(*) from 
(
SELECT a.question_id, max(a.correct) correct 
FROM answered a JOIN questions q ON a.question_id = q.id 
WHERE a.user_id = 1 AND q.category_id = 1 
GROUP BY a.question_id 
) B 
group by b.correct 

如果以后不正确的答案消除正确的,你只需要最后的/当前的结果:

select a.correct,count(*) from 
(
select user_id, question_id, max(created) maxDate 
from answered a WHERE a.user_id = 1 
group by a.user_id, a.question_id 
) m 

join answered a 
on m.question_id=a.question_id 
    and m.user_id=a.user_id 
    and m.maxDate=a.created 
join questions q on a.question_id=q.id 

where q.category_id = 1 

group by a.correct 
+1

该查询给出了预期的结果,但不正确。您正在选择具有更正答案的行,而不是最后一个答案的行。 – 2012-07-31 15:47:34

+0

已修复。我认为只有一个正确的答案需要标记用户回答的问题。 – valex 2012-07-31 16:37:37