我有一组包含工作人员的表格'不同形式的次要专业。实际上,只有少数主要专业允许一个人拥有二级专业。
我制作了一个UNION视图,以这种方式结合了次要专业,它运行良好:
SELECT tpl.id, tpl.speciality, 20 as gr FROM tpath_list tpl
UNION ALL
SELECT tlt.id, tlt.lab_type as speciality, 11 as gr FROM tlab_types tlt
UNION ALL
SELECT til.id, til.speciality, 10 as gr FROM tinstrumental_list til
字段gr
包含主要专业(10,11和20)的索引字段,允许具有辅助专业。所有其他专业(id 1,2,3等)都没有辅助专业。
我收到这样的东西......
我现在可以使用WHERE gr=:n
从创建的视图中获取数据。
如何修改视图以便使用WHERE gr=:n
(1,2,3等)子句从中获取数据将为我提供单个记录id=1 speciality="Not specified" gr=n
依据社群的评论:
我需要获取表中存在并由视图显示的:n IN(10,11,20)
的所有记录。例如,:n=20
的图片中列出了3条记录。仅当:n NOT IN(10,11,20)
我需要在表(和视图)中缺少额外(单个)记录时。请注意,gr IN(10,11,20)
的记录包含id=1
和speciality='Not specified'
。
根据Jon Tofte-Hansen的要求
这是一个未过滤的视图输出(没有WHERE
子句)。
如果我使用WHERE gr=20
获取视图,我会得到以下内容(这就是我想要的):
如果使用WHERE gr=10
- 此设置(这就是我想要的):
如果我用WHERE gr=1
获取它,那么我想收到一个在用于创建视图的表中不存在的sigle记录。我希望得到这个输出,但不知道如何:
以下是表格的结构,如果有帮助的话:
DROP TABLE IF EXISTS `tspecialities_list`;
CREATE TABLE `tspecialities_list` (
`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`speciality` varchar(30) NOT NULL DEFAULT '',
PRIMARY KEY (`id`,`speciality`),
KEY `i_by_speciality` (`speciality`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `tlab_types`;
CREATE TABLE `tlab_types` (
`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`lab_type` varchar(255) DEFAULT NULL,
`deleted` smallint(5) unsigned DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `tpath_list`;
CREATE TABLE `tpath_list` (
`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`speciality` varchar(30) NOT NULL DEFAULT '',
PRIMARY KEY (`id`,`speciality`),
KEY `i_by_speciality` (`speciality`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `tinstrumental_list`;
CREATE TABLE `tinstrumental_list` (
`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`speciality` varchar(30) NOT NULL DEFAULT '',
PRIMARY KEY (`id`,`speciality`),
KEY `i_by_speciality` (`speciality`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
答案 0 :(得分:1)
你想要的并不完全清楚,但这可能就是这样。添加一个额外的联合,生成三个表中没有辅助专业的所有id:
SELECT tpl.id, tpl.speciality, 20 as gr FROM tpath_list tpl
UNION ALL
SELECT tlt.id, tlt.lab_type as speciality, 11 as gr FROM tlab_types tlt
UNION ALL
SELECT til.id, til.speciality, 10 as gr FROM tinstrumental_list til
UNION ALL
select tsl.id, 'Not specified', tsl.id as gr from tspecialities_list tsl
where tsl.id not in
(SELECT tpl.id FROM tpath_list tpl
UNION
SELECT tlt.id FROM tlab_types tlt
UNION
SELECT til.id FROM tinstrumental_list til)
答案 1 :(得分:-1)
您似乎只是要求以下内容:
SELECT *
FROM viewname
WHERE speciality='Not specified' and gr=:n
有没有理由这不是你想要的?