我目前正在开发一个测验网站。
我有一个大约的数据库。 1000 个问题 - 但数据库会一周又一周地增长。
每天,每位参加测验的用户将随机获得 5 个问题。
问题是我不希望单个用户在两个不同的日期两次遇到相同的问题。
我正在存储用户回答的所有问题的历史记录,因此我可以知道用户 id:1 已在日期 YYYY-MM-DD 回答了问题 id:4 的答案 id:4
基本上:
entry_id | user_id | question_id | answer_id | good | date
所以当我随机得到 5 个问题给用户时,我有两个选择:
SELECT question, question_id FROM questions WHERE question_id != 'X' AND question_id != 'Y' AND question_id != 'Z' ORDER BY RAND() LIMIT 0,5
或(更简单)
SELECT question, question_id FROM questions WHERE question_id NOT IN(X,Y,Z)
我的问题:
假设我的用户到目前为止已经回答了 500 个问题(100 天的事件)。我给他新问题的查询会非常长
... NOT IT({huge list of ids for which the user has already answered})
或
... question_id != 'A' AND question_id != 'B' and so on and so on.
我担心的是,随着时间的推移,我的查询会变得非常慢。想象一下我必须为他回答 5 个问题的用户,知道他已经回答了 5000 个问题,查询会杀死我的服务器,不是吗?
有什么方法可以让我通过知道所有问题的 ID 都已经回答并确保查询不会太难处理我的服务器来为我的用户随机获取 5 个问题?
提前致谢!
最佳答案
NOT EXISTS
在这种情况下可能会更好地为您服务。
SELECT q.question, q.question_id
FROM questions q
WHERE NOT EXISTS(SELECT NULL
FROM answers a
WHERE a.question_id = q.question_id
AND a.user_id = 'YourUser')
ORDER BY RAND() LIMIT 0,5
关于MySQL : Get results from DB knowing that we don't want to get specific ids,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6126666/