在postgresql中每行加入+计数

Mau*_*oon 3 sql 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
Run Code Online (Sandbox Code Playgroud)

目前的"问题"表:

ID  ANSWER
1   A
2   A
3   B
4   C
5   C
6   C
7   C
Run Code Online (Sandbox Code Playgroud)

现在我想根据解决的次数来订购问题.如您所见,问题1已经解决了3次,而问题5,6和7已经解决了0次.在我做出这个订单之后,我想选择一个随机的前5个问题,解决的问题最少.

因此,我的问题是:怎么做?我的最终目标是在rails中执行此操作,但首先我想尝试一下postgresql.所以你知道怎么做吗?代码示例高度赞赏.

问候,

莫里斯

//更新

好吧,我试着把你的建议付诸实践,但我遇到了问题.正如你所看到的,我只是得到了一行,我认为是因为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)
Run Code Online (Sandbox Code Playgroud)

//更新2

好吧,我做了一个嵌套选择来解决这个问题(灵感来自如何从表中加入COUNT,然后用另一个JOIN实现该COUNT):

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
Run Code Online (Sandbox Code Playgroud)

给我一些东西:一个重要的清单.

现在,我仍然需要创建具有最少计数随机5个问题.

我现在尝试用min(count)做一些事情,但这似乎没有成功.关于如何做到这一点的任何想法?

再次感谢

Mar*_*ams 10

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)
Run Code Online (Sandbox Code Playgroud)


Jay*_*Jay 4

像下面这样的怎么样?

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
Run Code Online (Sandbox Code Playgroud)

摘要:它将 questions 表连接到 attempts 表,仅考虑正确为 true 的行,按问题 id 分组,按每个问题的真实尝试次数排序,然后限制为前 5 个结果。

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

  • 您需要选择“问题”,然后选择“尝试时左连接”,否则不会显示没有尝试的问题。 (2认同)