我有三个表:用户、问题和操作。这些保存与用户在教程网站上回答问题有关的数据。一旦他们回答了足够多的问题,他们就会进入新的问题部分。他们不断地从未回答的问题池中以随机顺序请求问题,直到他们全部完成。
如果用户没有为该部分获得足够的正确问题,并且该特定部分的数据库中的问题总数不足,我的代码需要循环返回并再次以随机顺序为他们提供所有部分的问题。
直到那时我一直在使用这个查询,
SELECT action_int
FROM actions
WHERE user_id = '".$this->id."'
AND action_type = 'given_question'
AND action_details = 'weekly'
AND action_int IN (
SELECT action_int
FROM actions
WHERE user_id = '".$this->id."'
AND action_type = 'answered_question'
)
AND action_int IN (
SELECT id
FROM questions
WHERE section_id = '".$this->current_section."'
)
action_int 是存储在操作表中的问题 ID。这将在用户当前部分返回所有已回答的问题,但如果代码已循环返回,则不会重复。
所以,我解决这个问题的第一种方法是,我想查询数据库,以便找出用户回答的每个问题,计算他回答了这个独特问题的次数(以防他们之前循环了所有问题) , 并从 count 最小 (MIN()) 的值中随机选择一个问题 id。
我已经试了,
SELECT q.id, a.count
FROM questions q
LEFT JOIN (
SELECT
action_int AS id, count(action_int) AS 'count'
FROM
actions
WHERE
action_type = 'answered_question'
GROUP BY action_int) a
ON a.id = q.id
返回,
id count
14 2
16 3
17 3
11 null
13 null
15 null
18 1
12 1
19 null
这通常是我所追求的。
所以问题,
- 有一个更好的方法吗?也许这样如果一个问题还没有得到回答,它会返回 0 而不是 null?
- 如果我只想计算用户当前部分中已回答的问题(作为 section_id 存储在问题中,作为 current_section 存储在问题中),如何从部分编号返回仅包含 [id, count] 个问题的列?