Lintcode SQL 教程 LEVEL 6 第2578题答案

2578 · 更新数据触发消息提醒

一、题目描述

题目链接: https://www.lintcode.com/learn/209/588.
描述:
  为名为 members 的表创建了一个 UPDATE 触发器,要求实现数据修改后,记录修改信息 memberId = [id],message = ‘Update {[old]} To {[new]}’ 到 reminders 表中
  [id] 为 members 中被修改的记录的主键 id
  [old] 与 [new] 中参数说明:只显示有被修改到的字段,如:name 由 Tom 更新为 Jack ,[old] 显示为 [name=tom] ,[new] 显示为 [name=jack]
在这里插入图片描述
在这里插入图片描述

二、算法思想

  题目要求message中只包含更新的信息,所以要对每个列的new值和old值进行比较。当old值和new值不一样时说明该列的信息更新了,这时要把更新信息放入message中;当old值和new值不一样时,不能把变动信息放进去,要把该部分设为’’。
  由于水平有限,本代码中设定了很多变量来存储字符串,用了3个if语句判断信息是否变动,最后把字符串连接起来,就组合成了符合题意要求的字符串。

三、代码

create trigger after_update_members 
after update 
on members  for each row 
begin 
--存储信息的8个变量
declare message varchar(255);
declare message1 varchar(255);
declare message2 varchar(255);
declare message3 varchar(255);
declare message4 varchar(255);
declare message5 varchar(255);
declare message6 varchar(255);
declare message7 varchar(255);

--字符串拼接过程中的中转变量
declare message11 varchar(255);
declare message12 varchar(255);
declare message13 varchar(255);
declare message14  varchar(255);
declare message15  varchar(255);

set message='Update {';

--判断姓名信息是否改变,
--若改变则把变动的信息存在message1和message5里,
--否则把它们设为''
if new.name!=old.name then
set message1=concat('[name=', old.name, '] ');
set message5=concat('[name=',new.name,'] ');
else 
set message1='';
set message5='';
end if;

if new.email!=old.email then
set message2=concat('[email=',old.email,'] ');
set message6=concat('[email=',new.email,'] ');
else 
set message2='';
set message6='';
end if;

if new.birthDate!=old.birthDate then 
set message3=concat('[birthDate=',old.birthDate,'] ');
set message7=concat('[birthDate=',new.birthDate,'] ');
else 
set message3='';
set message7='';
end if;

set message4='} To {';

--把判断好的各个部分拼接在一起
set message11=concat(message,message1 ,message2);
set message12=concat(message3,message4,message5);
set message13=concat(message6,message7);
set message14=concat(message11,message12,message13);
set message15=concat(message14,'}');

insert into reminders(memberId,message)
values(old.id,message15);
end 

四、结果

在这里插入图片描述
菜鸟一只,欢迎大佬指教!

1、 列出student表中所有记录的sname、sex和class列。 2、 显示教师所有的单位即不重复的depart列。 3、 显示学生表的所有记录。 4、 显示score表中成绩在60到80之间的所有记录。 5、 显示score表中成绩为85,86或88的记录。 6、 显示student表中“95031”班或性别为“女”的同学记录。 7、 以class降序显示student表的所有记录。 8、 以cno升序、degree降序显示score表的所有记录。 9、 显示“98031”班的学生人数。 10、显示score表中的最高分的学生学号和课程号。 11、显示“3-105”号课程的平均分。 12、显示score表中至少有5名学生选修的并以3开头的课程号的平均分数。 13、显示最低分大于70,最高分小于90 的sno列。 14、显示所有学生的 sname、 cno和degree列。 15、显示所有学生的 sname、 cname和degree列。 16、列出“95033”班所选课程的平均分。 17、显示选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。 18、显示score中选修多门课程的同学中分数为非最高分成绩的记录。 19、显示成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。 20、显示出和学号为“108”的同学同年出生的所有学生的sno、sname和 birthday列。 21、显示“张旭”老师任课的学生成绩。 22、显示选修某课程的同学人数多于5人的老师姓名。 23、显示“95033”班和“95031”班全体学生的记录。 24、显示存在有85分以上成绩的课程cno。 25、显示“计算机系”老师所教课程的成绩表。 26、显示“计算机系”与“电子工程系”不同职称的老师的tname和prof。 27、显示选修编号为“3-105”课程且成绩至少高于“3-245”课程的同学的cno、sno和degree,并按degree从高到低次序排列。 28、显示选修编号为“3-105”课程且成绩高于“3-245”课程的同学的cno、sno和degree。 29、列出所有任课老师的tname和depart。 30、列出所有未讲课老师的tname和depart。 31、列出所有老师和同学的 姓名、性别和生日。 32、检索所学课程包含学生“103”所学课程的学生学号。 33、检索选修所有课程的学生姓名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值