当前“尝试”表:
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
好的,我试着将你的建议付诸实践,但我遇到了问题。正如你所看到的,我只是得到了一行,我认为是因为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)做一些事情,但这似乎没有成功。关于如何做到这一点的任何想法?
再次感谢
答案 0 :(得分:8)
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)
答案 1 :(得分: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分组,按每个问题的真实尝试次数排序,然后限制前五个结果。
我还没有测试过,但我认为它至少应该接近你想要的。