【问题标题】:Join + Count per row in postgresql在 postgresql 中加入 + 计数每行
【发布时间】:2011-04-26 02:07:53
【问题描述】:

当前“尝试”表:

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。那么你知道怎么做吗?代码示例高度赞赏。

问候,

莫里斯

// 更新

好的,我尝试将您的建议付诸实践,但我遇到了问题。正如你所看到的,我只是得到 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) 做一些事情,但这似乎没有成功。关于如何做到这一点的任何想法?

再次感谢

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:
    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)
    

    【讨论】:

      【解决方案2】:

      像下面这样的东西怎么样?

      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 分组,按每个问题的真实尝试次数排序,然后限制为前五个结果。

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

      【讨论】:

      • 您需要选择问题,然后在尝试时选择 LEFT JOIN,否则未尝试的问题将不会显示。
      • 感谢马库斯的评论。我只是想发布它,因为出了点问题!我相信 WHERE 无需尝试即可消除这些问题。如果没有 where,它会生成一个很好的列表,其中包含所有未尝试的问题,count = 1。但是,如果使用 where,它只会显示尝试过的问题。
      猜你喜欢
      • 2017-01-20
      • 2015-11-22
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      • 2013-01-12
      • 2014-10-01
      相关资源
      最近更新 更多