首先设计数据库表结构,包括问卷、题目、选项、回答和答案详情五张表,通过外键关联;接着用sql创建表并实现增删改查操作,如插入问卷题目、保存用户回答、统计选项次数等;最后可扩展用户标识、逻辑跳转、状态管理及数据导出功能,配合后端语言提供Web服务。

搭建一个简单的问卷调查系统,核心是设计合理的数据表结构,并通过 SQL 实现问卷的增删改查与答题逻辑。下面以 mysql 为例,带你一步步实现一个基础但完整的问卷系统。
1. 数据库表结构设计
一个基本的问卷系统需要管理问卷、题目、选项和用户回答。建议创建以下几张表:
问卷表(surveys)
存储问卷基本信息
- id: 主键
- title: 问卷标题
- description: 描述
- created_at: 创建时间
题目表(questions)
每个问题属于某个问卷
- id: 主键
- survey_id: 外键,关联 surveys.id
- content: 题目内容
- type: 题型(如单选 radio、多选 checkbox、文本 text)
选项表(options)
每个题目可有多个选项
- id: 主键
- question_id: 外键,关联 questions.id
- option_text: 选项文字
- sort_order: 排序
回答表(responses)
记录用户提交的答卷
- id: 主键
- survey_id: 所属问卷
- submitted_at: 提交时间
答案详情表(answers)
每道题的回答明细
- id: 主键
- response_id: 外键,关联 responses.id
- question_id: 对应题目
- option_id: 选择的选项(多选可多条记录)
- text_answer: 文本类题目的回答内容
2. 创建表的 SQL 示例
执行以下语句建立数据库结构:
CREATE TABLE surveys ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL, description TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); <p>CREATE TABLE questions ( id INT AUTO_INCREMENT PRIMARY KEY, survey_id INT, content TEXT NOT NULL, type ENUM('radio', 'checkbox', 'text') DEFAULT 'radio', FOREIGN KEY (survey_id) REFERENCES surveys(id) ON DELETE CAScadE );</p><p>CREATE TABLE options ( id INT AUTO_INCREMENT PRIMARY KEY, question_id INT, option_text VARCHAR(255), sort_order INT DEFAULT 0, FOREIGN KEY (question_id) REFERENCES questions(id) ON DELETE CASCADE );</p><p>CREATE TABLE responses ( id INT AUTO_INCREMENT PRIMARY KEY, survey_id INT, submitted_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (survey_id) REFERENCES surveys(id) );</p><p>CREATE TABLE answers ( id INT AUTO_INCREMENT PRIMARY KEY, response_id INT, question_id INT, option_id INT DEFAULT NULL, text_answer TEXT, FOREIGN KEY (response_id) REFERENCES responses(id) ON DELETE CASCADE, FOREIGN KEY (question_id) REFERENCES questions(id), FOREIGN KEY (option_id) REFERENCES options(id) );</p>
3. 常见操作 SQL 示例
添加一份问卷和题目
-- 添加问卷 INSERT INTO surveys (title, description) VALUES ('用户满意度调查', '了解用户体验'); <p>-- 添加题目 INSERT INTO questions (survey_id, content, type) VALUES (1, '您对服务满意吗?', 'radio');</p><p>-- 添加选项 INSERT INTO options (question_id, option_text, sort_order) VALUES (1, '非常满意', 1), (1, '一般', 2), (1, '不满意', 3);</p>
保存用户回答
-- 记录一次提交 INSERT INTO responses (survey_id) VALUES (1); SET @response_id = LAST_INSERT_ID(); <p>-- 回答选择题 INSERT INTO answers (response_id, question_id, option_id) VALUES (@response_id, 1, 1); -- 选了“非常满意”</p><p>-- 回答文本题(假设还有个文本题 question_id=2) INSERT INTO answers (response_id, question_id, text_answer) VALUES (@response_id, 2, '希望响应更快一些');</p>
统计某题各选项被选次数
SELECT o.option_text, COUNT(a.option_id) as count FROM options o LEFT JOIN answers a ON o.id = a.option_id WHERE o.question_id = 1 GROUP BY o.id, o.option_text;
4. 系统扩展建议
基础功能完成后,可逐步增强:
- 增加用户标识字段(如 user_id),防止重复提交
- 支持逻辑跳转:根据前一题答案决定是否显示下一题
- 添加问卷状态(启用/关闭)
- 导出统计结果到 csv 或图表展示
- 使用索引优化查询性能,如在 survey_id、question_id 上建索引
基本上就这些。用好外键约束和合理拆表,MySQL 能很好地支撑一个轻量级问卷系统。实际开发中配合 php、python 或 node.js 提供 Web 接口即可对外服务。
以上就是mysql中如何开发简单问卷调查系统_mysql问卷系统项目实战的详细内容,更多请关注php中文网其它相关文章!