计划
- 修复
subjectAllocation
,使其可访问和可链接
- 使用序列生成器(来自 digits_v)将可变长度字符串展开为结构化数据
- 以简单的方式访问结构化数据,加入索引字段
设置
create table subject_Master
(
subjectId integer primary key not null,
subjectShortName varchar(23) not null
);
create table class_Master
(
classId integer primary key not null,
className varchar(23) not null
);
create table subjectAllocation_inaccessible
(
allocationId integer primary key not null,
classId integer not null,
subjectId varchar(32) not null,
foreign key ( classId ) references class_Master ( classId )
);
create table subjectAllocation
(
allocationId integer primary key not null,
classId integer not null,
subjectId integer not null,
foreign key ( classId ) references class_Master ( classId ),
foreign key ( subjectId ) references subject_Master ( subjectId )
);
insert into subject_Master
( subjectId, subjectShortName )
values
( 1 , 'English' ),
( 2 , 'French' ),
( 3 , 'German' ),
( 4 , 'Latin' )
;
insert into class_Master
( classId, className )
values
( 1 , 'Rose' ),
( 2 , 'Dasy' ),
( 3 , 'Lily' )
;
insert into subjectAllocation_inaccessible
( allocationId, classId, subjectId )
values
( 1 , 1 , '1,2' ),
( 2 , 2 , '2,3,4' ),
( 3 , 3 , '1,2,3,4' )
;
修复主题分配
create view digits_v
as
SELECT 0 AS N
UNION ALL
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4
UNION ALL
SELECT 5
UNION ALL
SELECT 6
UNION ALL
SELECT 7
UNION ALL
SELECT 8
UNION ALL
SELECT 9
;
insert into subjectAllocation
( allocationId, classId, subjectId )
select @row_number := @row_number + 1 as allocationId, sa.classId, substring_index(substring_index(sa.subjectId, ',', n.n), ',', -1) sub
from subjectAllocation_inaccessible sa
cross join
(
select a.N + b.N * 10 + 1 n
from digits_v a
cross join digits_v b
order by n
) n
cross join ( select @row_number := 0 ) params
where n.n <= 1 + (length(sa.subjectId) - length(replace(sa.subjectId, ',', '')))
;
访问简单
select c.className, group_concat(s.subjectShortName)
from subjectAllocation sa
inner join class_Master c
on sa.classId = c.classId
inner join subject_Master s
on sa.subjectId = s.subjectId
group by c.className
;
这里与 class_Master 的连接可以使用主索引( subjectId )
输出
+-----------+----------------------------------+
| className | group_concat(s.subjectShortName) |
+-----------+----------------------------------+
| Dasy | French,German,Latin |
| Lily | German,Latin,English,French |
| Rose | English,French |
+-----------+----------------------------------+
sqlfiddle
参考