目录
1、使用的业务背景
2、如何使用及注意事项
3、实操结果
3.1、获得以前回答的试题信息用于存储新权重表
3.2、依据用户Id与2取余随机回答第3题
3.3、两者数据union操作 获得最后需要入库数据99条
3.4 最后所书写的SQL
3.5、最后插入后数据表数据
4、书写SQL语句或者更新数据一定的试验和小心
5、最后显示效果图
本人最近在做一个项目,此业务以前是一个新手引导,新用户需要回答两个题目,然后根据用户回答的习惯来给予相关的课程推送信息。但是在第二个版本的时候,居然变更了。以前的第一题以前是两个选项(早上、晚上),结果加入的第三个选项(中午),于是有了(早上、中午、晚上),同时还增加了一个试题。同时需要根据回答结果计算权重,存储新的设计的表之中。
引申出来一下两问题:
(1)、以前回答的是晚上是B选项,现在变化为C选项了。
(2)、现在以前回答的人未回答第三题。
如何解决此问题:可能以下两种方案解决:
(1)、删除以前回答过的数据,让以前的用户在回答一次,方法粗暴,但是疗效不错。但是会引来以前答过的用户反感,我已经答过为何还要继续回答呢?
(2)、针对以前回答过的试题数据与试题基础数据联合查询,然后按照现在的设计表的规则,插入到新的权重表之中。同时通过获得用户最新答过的数据取最大时间一条数据作为生成回答第3题的基础信息数据,通过人为构造方式为用户自动,并且以用户id与2取余方式(id%2),依据余数随机生成第3题的答案信息。这样可以让以前回答试题的用户平稳的实现试题的回答。
于是就需要使用 Insert into table select * from
INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表(目标表)中,目标表中任何已存在的行都不会受影响。
语句1:Insert into TargetTable(field1,field2,…) select value1,value2,… from Table1 where condition;
语句2:Insert into TargetTable select * from Table1;
说明:
1)目标表TargetTable必须存在,MySQL不会自动创建;
2)语句1一般用于两个表结构一致的情况,而语句2用于表结构不一致的情况;
3)语句1中涉及的field1,field2也必须存在;
4)若TargetTable有主键且不具备自动增长,则 field1, field2…中必须包括主键。
1、获得以前回答过的试题信息SQL
SELECT
'02' AS lable_type,
CASE
WHEN a.question_id = 1
OR a.question_id = 5 THEN
21
WHEN a.question_id = 2
OR a.question_id = 6 THEN
22
END lable_sub_type,
0.2 AS user_habit_weight,
a.question_id,
a.user_answers,
CASE
a.user_answers
WHEN 'A' THEN
b.option_a
WHEN 'B' THEN
b.option_b
WHEN 'C' THEN
b.option_c
END user_answer_text,
a.creator_id,
a.create_name,
a.create_time,
a.org_id,
a.owner_company
FROM
(
SELECT
t.question_id,
t.user_answers,
t.creator_id,
t.create_name,
t.create_time,
t.org_id,
t.owner_company
FROM
ai_xqi_beginner_guidance_result t
WHERE
t.question_type = '01'
AND t.creator_id IS NOT NULL
AND t.owner_company != 10004
) a
LEFT JOIN ai_xqi_beginner_guidance_question b ON a.question_id = b.id
SELECT
'02' AS lable_type,
23 AS lable_sub_type,
0.2 AS user_habit_weight,
CASE
c.owner_company
WHEN 10001 THEN
9
WHEN 10003 THEN
10
END answered_question_id,
CASE
c.creator_id % 2
WHEN 1 THEN
'A'
WHEN 0 THEN
'B'
END user_habit_answer,
CASE
c.creator_id % 2
WHEN 1 THEN
'一目十行'
WHEN 0 THEN
'慢条斯理'
END user_habit_answer_text,
c.creator_id,
c.create_name,
max( c.create_time ) AS create_time,
c.org_id,
c.owner_company
FROM
(
SELECT
t.creator_id,
t.create_name,
t.create_time,
t.org_id,
t.owner_company
FROM
ai_xqi_beginner_guidance_result t
WHERE
t.question_type = '01'
AND t.creator_id IS NOT NULL
AND t.owner_company != 10004
) c
GROUP BY
c.creator_id
/** 把以前回答过的新手引导(学习习惯)已经回答的 按照现有标准 相关权重值写入新的数据库表之中 */
/** 1、获得已经已经答过人的新手习惯数据 2、根据所属公司 给每个添加一条 学习习惯第三题记录 */
INSERT INTO ai_xqi_user_habit_weight_personas(
lable_type,
lable_sub_type,
user_habit_weight,
answered_question_id,
user_habit_answer,
user_habit_answer_text,
creator_id,
create_name,
create_time,
org_id,
owner_company
)
SELECT
*
FROM
(
(
SELECT
'02' AS lable_type,
CASE
WHEN a.question_id = 1
OR a.question_id = 5 THEN
21
WHEN a.question_id = 2
OR a.question_id = 6 THEN
22
END lable_sub_type,
0.2 AS user_habit_weight,
a.question_id,
a.user_answers,
CASE
a.user_answers
WHEN 'A' THEN
b.option_a
WHEN 'B' THEN
b.option_b
WHEN 'C' THEN
b.option_c
END user_answer_text,
a.creator_id,
a.create_name,
a.create_time,
a.org_id,
a.owner_company
FROM
(
SELECT
t.question_id,
t.user_answers,
t.creator_id,
t.create_name,
t.create_time,
t.org_id,
t.owner_company
FROM
ai_xqi_beginner_guidance_result t
WHERE
t.question_type = '01'
AND t.creator_id IS NOT NULL
AND t.owner_company != 10004
) a
LEFT JOIN ai_xqi_beginner_guidance_question b ON a.question_id = b.id
) UNION
(
SELECT
'02' AS lable_type,
23 AS lable_sub_type,
0.2 AS user_habit_weight,
CASE
c.owner_company
WHEN 10001 THEN
9
WHEN 10003 THEN
10
END answered_question_id,
CASE
c.creator_id % 2
WHEN 1 THEN
'A'
WHEN 0 THEN
'B'
END user_habit_answer,
CASE
c.creator_id % 2
WHEN 1 THEN
'一目十行'
WHEN 0 THEN
'慢条斯理'
END user_habit_answer_text,
c.creator_id,
c.create_name,
max( c.create_time ) AS create_time,
c.org_id,
c.owner_company
FROM
(
SELECT
t.creator_id,
t.create_name,
t.create_time,
t.org_id,
t.owner_company
FROM
ai_xqi_beginner_guidance_result t
WHERE
t.question_type = '01'
AND t.creator_id IS NOT NULL
AND t.owner_company != 10004
) c
GROUP BY
c.creator_id
)
) last
ORDER BY
last.creator_id ASC,last.lable_sub_type ASC
其中子标签为23的为新试题自动插入数据,为21标红的为修改C选项的数据,经过实际程序测试达到如何预期要求。
本人发现在书写常量原来是02,结果写成了01,本身是21,22,23的子类型,结果写成11,12,13;所以必须在测试环境验证,否则一旦到生成库,就可能导致生产事故。