SQL 从 3 个表中获取所需结果的查询
SQL query for getting desired result from 3 tables
架构
CREATE TABLE IF NOT EXISTS `exams` (
`id` int(6) unsigned NOT NULL,
`name` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `institutions` (
`id` int(6) unsigned NOT NULL,
`name` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `exam_scores` (
`id` int(6) unsigned NOT NULL,
`exam_id` int(6) NOT NULL,
`institution_id` int(6) NOT NULL,
`score` int(5)
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `exams` (`id`, `name`) VALUES
('1', 'exam1'),
('2', 'exam2'),
('3', 'exam3'),
('4', 'exam4');
('5', 'exam5');
INSERT INTO `institutions` (`id`, `name`) VALUES
('1', 'institution1'),
('2', 'institution2'),
('3', 'institution3'),
('4', 'institution4');
('5', 'institution5');
INSERT INTO `exam_scores` (`id`, `exam_id`, `institution_id`, `score`) VALUES
('1', '1', 1, 40),
('2', '2', 1, 45),
('3', '3', 2, 35),
('4', '1', 2, 30);
('5', '4', 3, 40);
现在用户将输入exm1
我正在尝试创建查询以查找如下所示的所有相关考试。
查找匹配输入 exm1
的考试,同时查找匹配机构 inn exam_scores
table.
中存在的其他考试
例1:输入exm4
desired output
| exm4 |
例2:输入exm3
desired ouput
| exm3 |
| exm1 |
例3:输入exm1
desired output
| exm1 |
| exm2 |
| exm3 |
到目前为止,我只提出了一个只给出匹配考试的查询:)
select exams.name from exams
inner join exam_scores on exam_scores.exam_id = exams.id
// ??
where exams.id = 1
您可以使用 join
s 执行此操作:
select distinct e1.name
from exams e1
inner join exam_scores es1 on es1.exam_id = e1.id
inner join exam_scores es2 on es2.institution_id = es1.institution_id
inner join exams e2 on e2.id = es2.exam_id
where e2.name = ?
我建议使用变量,因为它允许您使用 SET 操作轻松更新变量的值(例如,如果您的用户将要使用 GUI)。
在下面的代码中,您只需将 exm1
值更改为所需的值即可。
declare @input nvarchar(10);
set @input = 'exm1';
select distinct a.name
from exams a
inner join exam_scores b on b.exam_id = a.id
inner join exam_scores b2 on b2.institution_id = b.institution_id
inner join exams a2 on a2.id = b2.exam_id
where a2.name = @input
架构
CREATE TABLE IF NOT EXISTS `exams` (
`id` int(6) unsigned NOT NULL,
`name` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `institutions` (
`id` int(6) unsigned NOT NULL,
`name` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `exam_scores` (
`id` int(6) unsigned NOT NULL,
`exam_id` int(6) NOT NULL,
`institution_id` int(6) NOT NULL,
`score` int(5)
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `exams` (`id`, `name`) VALUES
('1', 'exam1'),
('2', 'exam2'),
('3', 'exam3'),
('4', 'exam4');
('5', 'exam5');
INSERT INTO `institutions` (`id`, `name`) VALUES
('1', 'institution1'),
('2', 'institution2'),
('3', 'institution3'),
('4', 'institution4');
('5', 'institution5');
INSERT INTO `exam_scores` (`id`, `exam_id`, `institution_id`, `score`) VALUES
('1', '1', 1, 40),
('2', '2', 1, 45),
('3', '3', 2, 35),
('4', '1', 2, 30);
('5', '4', 3, 40);
现在用户将输入exm1
我正在尝试创建查询以查找如下所示的所有相关考试。
查找匹配输入 exm1
的考试,同时查找匹配机构 inn exam_scores
table.
例1:输入exm4
desired output
| exm4 |
例2:输入exm3
desired ouput
| exm3 |
| exm1 |
例3:输入exm1
desired output
| exm1 |
| exm2 |
| exm3 |
到目前为止,我只提出了一个只给出匹配考试的查询:)
select exams.name from exams
inner join exam_scores on exam_scores.exam_id = exams.id
// ??
where exams.id = 1
您可以使用 join
s 执行此操作:
select distinct e1.name
from exams e1
inner join exam_scores es1 on es1.exam_id = e1.id
inner join exam_scores es2 on es2.institution_id = es1.institution_id
inner join exams e2 on e2.id = es2.exam_id
where e2.name = ?
我建议使用变量,因为它允许您使用 SET 操作轻松更新变量的值(例如,如果您的用户将要使用 GUI)。
在下面的代码中,您只需将 exm1
值更改为所需的值即可。
declare @input nvarchar(10);
set @input = 'exm1';
select distinct a.name
from exams a
inner join exam_scores b on b.exam_id = a.id
inner join exam_scores b2 on b2.institution_id = b.institution_id
inner join exams a2 on a2.id = b2.exam_id
where a2.name = @input