mysql中如何开发简单问卷调查系统_mysql问卷系统项目实战

来源:这里教程网 时间:2026-02-28 20:29:55 作者:

搭建一个简单的问卷调查系统,核心是设计合理的数据表结构,并通过 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 接口即可对外服务。

相关推荐