如果Count(*)= 0,如何获取包含内容的记录

时间:2015-10-27 13:18:40

标签: mysql sql

我有一组包含工作人员的表格'不同形式的次要专业。实际上,只有少数主要专业允许一个人拥有二级专业。

我制作了一个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等)都没有辅助专业。

我收到这样的东西......

enter image description here

我现在可以使用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=1speciality='Not specified'

根据Jon Tofte-Hansen的要求

这是一个未过滤的视图输出(没有WHERE子句)。

enter image description here

如果我使用WHERE gr=20获取视图,我会得到以下内容(这就是我想要的):

enter image description here

如果使用WHERE gr=10 - 此设置(这就是我想要的):

enter image description here

如果我用WHERE gr=1获取它,那么我想收到一个在用于创建视图的表中不存在的sigle记录。我希望得到这个输出,但不知道如何:

enter image description here

以下是表格的结构,如果有帮助的话:

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;

2 个答案:

答案 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

有没有理由这不是你想要的?