【问题标题】:SQL query for getting desired result from 3 tables从 3 个表中获取所需结果的 SQL 查询
【发布时间】:2021-01-07 18:33:51
【问题描述】:

架构

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 表中存在的其他考试。

示例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

【问题讨论】:

  • exm1 的输出不应该是 exm1exm2
  • @Tajni 因为exm1 匹配institution (id: 2)institution id 2 有exm3 :) 所以输出是正确的。

标签: mysql sql join inner-join where-clause


【解决方案1】:

您可以通过joins 做到这一点:

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 = ?

【讨论】:

    【解决方案2】:

    我建议使用变量,因为它可以让您使用 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
    

    【讨论】:

      猜你喜欢
      • 2012-07-21
      • 2012-12-31
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 2020-12-28
      • 2023-03-11
      • 2021-02-15
      • 2013-11-30
      相关资源
      最近更新 更多