数据库排序问题,麻烦了

需要在mysql数据库做一个表,类似这样,

img


对所有学科进行分类,语文用2表示,英语用4表示,数学用6表示,各科内容不变,其他学科依次延续,因为涉及学科太多,各位大神,如何快速批处理?求助想要这样的结果

img

原理:上下两个表全连接查询输出,如果需要可以将结果导入新表

方法1:用户自定义学科weight

create database csdn;
use csdn;
CREATE  table A(
  coursecatogory varchar(20),
    coursename varchar(20)
);
CREATE table B(
    weight int,
    coursecatogory varchar(20)
);

insert into A VALUES('语文','文言文');
insert into A VALUES('语文','古诗');
insert into A VALUES('英语','阅读理解');
insert into A VALUES('英语','完形填空');
insert into A VALUES('数学','代数');
insert into A VALUES('数学','几何');
 
-- 用户可以指定
insert into B  VALUES(2,'语文');
insert into B  VALUES(4,'英语');
insert into B VALUES(6,'数学');
 
-- SELECT * FROM A;
-- SELECT * FROM B;
 
select b.weight as  coursecatogory, a.coursename
from A  a INNER JOIN B b
on a.coursecatogory = b. coursecatogory
ORDER BY B.weight ASC ;
-- 根据第二个表格给的数值排序,B表可以设置weight自增,不用手动输入权重

img

方法2:

create database csdn;
use csdn;
CREATE  table A(
  coursecatogory varchar(20),
    coursename varchar(20)
);

-- 插入数据,模拟数据库已有数据
insert into A VALUES('语文','文言文');
insert into A VALUES('语文','古诗');
insert into A VALUES('英语','阅读理解');
insert into A VALUES('英语','完形填空');
insert into A VALUES('数学','代数');
insert into A VALUES('数学','几何');


-- 构建辅助数据库
CREATE table B(
     weight int UNIQUE  AUTO_INCREMENT,
     coursecatogory varchar(20)
);

insert into B(coursecatogory)
select DISTINCT coursecatogory
from A
-- 根据已有的学科名降序排序(这个不能根据用户指定数字了)
ORDER BY  coursecatogory DeSC; 


-- 查询结果
select 2*b.weight as  coursecatogory, a.coursename
from A  a INNER JOIN B b
on a.coursecatogory = b. coursecatogory
ORDER BY B.weight ASC ;

img

方法三:使用存储过程,方法二改进,减少建B表

测试存储过程代码:

select  @weight:=@weight + 2 as w, coursecatogory
from (select DISTINCT coursecatogory from A    ORDER BY  coursecatogory DeSC) C,
            (select @weight:=0) D ;

img

这个和我们刚刚上面2种方法建立的B表存储内容格式一样
改进方法二后:

   create database csdn;
use csdn;
CREATE  table A(
     coursecatogory varchar(20),
    coursename varchar(20)
);

-- 插入数据,模拟数据库已有数据
insert into A VALUES('语文','文言文');
insert into A VALUES('语文','古诗');
insert into A VALUES('英语','阅读理解');
insert into A VALUES('英语','完形填空');
insert into A VALUES('数学','代数');
insert into A VALUES('数学','几何');

-- select 2*b.weight as  coursecatogory, a.coursename
-- from A  a INNER JOIN B b
-- on a.coursecatogory = b. coursecatogory
-- ORDER BY B.weight ASC ;

-- 根据已有的学科名降序排序(这个不能根据用户指定数字了) 
-- 类似构建B表格
-- select  @weight:=@weight + 2 as w, coursecatogory
-- from (select DISTINCT coursecatogory from A    ORDER BY  coursecatogory DeSC) C,
--             (select @weight:=0) D ;

select B.w as  coursecatogory, a.coursename
from A  a INNER JOIN 
(
select  @weight:=@weight + 2 as w, coursecatogory
from (select DISTINCT coursecatogory from A    ORDER BY  coursecatogory DeSC) C,
            (select @weight:=0) D 
)B
on a.coursecatogory = b. coursecatogory
ORDER BY B.w ASC ;

img

对相同科目的B列进行合并?

很简单:
假设你第一张表是Table1 , 表结构是 (id , crouse_type , crouse_name)
第二张表是Table2 , 表结构是 (id , tid , crouse_name, other)
其中tid是第一张表的关键字 id , 现在要把这两张表关联并按照顺序查出来:


select  t1.crouse_type, t1.crouse_name, t2.id,t2.other from Table1 t1 
join Table2 t2 on t1.id=t2.tid
order by t1.id 

建一个新表,有两个字段,id自增步长为2初始为2, 还有一个科目名称字段,然后

insert into 新表(科目名称)
select distinct 科目名称 from 原表;

update 原表 a,新表 b set a.科目名称=b.id where a.科目名称=b.科目名称;

这样既更新了数据,又保留了id和科目名称的对应关系,如果直接更新的话,你就不知道数字是对应哪个科目了

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632