毕业设计上的问题,请大家帮忙!

zhangyanan2000 2003-02-21 01:43:29
最近做毕业设计,用PHP+MySQL实现在线考试和试题的维护。其中在考试时有一种方式是自动出题,比如试题的表为:
Question(Q_id,title,...) 其中Q_id为题目编号(可设为auto_increasement),比如现在题库中有100道题,那我想随机从里面取二十道题应该如何写这个PHP函数?
我想到的方法是从1到100中任取20个不重复的数,就对应相应的题号,可是问题是如果在进行维护的时候,把某题删除了怎么办?比如老师把第十题(Q_id=10)删掉了,那再随机取数的时候如果再把10取出来怎么办?
请大家帮忙!多谢!
...全文
44 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuixin13 2003-02-21
  • 打赏
  • 举报
回复
呵呵,
不是要记录每个学生所答过的题嘛,
进行双表 LEFT JOIN
在 WHERE 子句中加入判断
zhangyanan2000 2003-02-21
  • 打赏
  • 举报
回复
首先谢谢你的热心帮助,使我重新有了编码的思路和方向。
不过通过记录标记来实现不重复取题是不行的,因为不重复只是相对这一次取题而言,题库是要多次被取题的。
再次谢谢你,我现在开始学习InnoDB
shuixin13 2003-02-21
  • 打赏
  • 举报
回复
你的需求
建议使用 InnoDB 类型表,
它是一个事务安全型表处理器

为了实现随机取前二十条语句你可以使用

SELECT Q_id,Title,... FROM `questions` ORDER BY RAND() LIMIT 20;
这样也可以避免老师将第 10 题删除的类似情况,

为了实现随机取出的是不重复的记录,
思路如下:

在 questions 表中为每个记录加一个字段 用于记录是否已被使用,
读取了该记录后就立即将其设置标志

因而用 InnoDB 表进行事务处理是最佳方案了,

读取记录时使用 FOR UPDATE 来进行记录锁定

BEGIN;
SELECT Q_id,Title,... FROM `questions` ORDER BY RAND() LIMIT 20 FOR UPDATE;
.....
.....
.....
COMMIT;

InnoDB 中文参考手册
http://expert.csdn.net/Expert/TopicView1.asp?id=1415869

56,912

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧