2010-10-15 40 views
1

当前“尝试”表:加入+每行数PostgreSQL中

ID QUESTION_ID CORRECT 
1 1    FALSE 
2 2    TRUE 
3 4    FALSE 
4 3    FALSE 
5 1    TRUE 
6 1    TRUE 
7 4    TRUE 
8 3    TRUE 
9 4    FALSE 
10 1    TRUE 
11 2    TRUE 
11 1    FALSE 
11 3    FALSE 

当前“问题”表:

ID ANSWER 
1 A 
2 A 
3 B 
4 C 
5 C 
6 C 
7 C 

现在,我希望用他们的解决倍量的订购问题。正如你所看到的,问题1已经解决了3次,而问题5,6和7已经解决了0次。 我做了这个命令后,我想选择一个随机排名最低的5个问题。

因此,我的问题是:如何做到这一点?我的最终目标是在rails中这样做,但首先我想用postgresql做一点实验。那么你知道如何做到这一点?代码示例非常感谢。

问候,

莫里斯

// UPDATE

好吧,我试图把你的建议付诸实践,但在运行了一个问题IM。正如你所看到的,我只是得到1行,我认为是因为where子句。这可能是因为我认为它错了吗?

=# select q.id, count(q.id) 
-# from questions as q 
-# left join attempts as a on a.question_id = q.id 
-# where a.correct = true and a.user_id = 4 
-# group by q.id 
-# order by count(q.id) desc 
-# limit 20 
-# \g 
id | count 
-----+------- 
112 |  2 
(1 row) 

//更新2

好吧,我做了一个嵌套查询来解决这个问题(由How to JOIN a COUNT from a table, and then effect that COUNT with another JOIN启发):

select q.id, temp.Count 
from questions as q 
left join 
(select q.id, count(a.id) as count 
from questions as q 
left join attempts as a 
on a.question_id = q.id 
where a.correct = true and a.user_id = 4 
group by q.id) 
temp on temp.id = q.id 

给我的东西:一个重要的列表。

现在,我仍然需要创建随机5个问题的最小数量为

我试图用min(count)做一些事情,但似乎没有解决。任何想法如何做到这一点?

再次感谢

回答

1

怎么样像下面的东西?

SELECT Q.ID, COUNT() 
FROM Questions AS Q 
LEFT JOIN Attempts AS A ON A.QUESTION_ID = Q.ID 
WHERE A.CORRECT = TRUE 
GROUP BY Q.ID 
ORDER BY COUNT() DESC 
LIMIT 5 

摘要: 它加入的问题表来尝试表,只考虑行,其中正确的是真实的,团体对这个问题的ID,排序由每题真正尝试的计数,然后限制顶端五个结果。

我还没有测试过它,但我认为它至少应该接近你要找的东西。

+0

你是一个救星!谢谢!! – 2010-10-15 18:39:31

+2

您需要选择问题,然后选择左侧尝试,否则无法尝试的问题不会显示出来。 – 2010-10-15 18:46:27

+0

感谢马库斯的评论。我只是想发布它,因为出现问题! 我相信WHERE会在没有尝试的情况下删除这些问题。没有地方,它会生成一个很好的列表,其中包含所有没有尝试的问题,count = 1。但是,在哪里,它只显示尝试的问题。 – 2010-10-15 19:01:41

6
SELECT Q.ID, COUNT(A.ID) AS SolveCount 
FROM Question Q 
LEFT JOIN Attempts A 
ON A.QUESTION_ID = Q.ID 
WHERE A.CORRECT = TRUE 
GROUP BY Q.ID 
ORDER BY COUNT(A.ID)