【问题标题】:SQL query to extract information from joined tables用于从连接表中提取信息的 SQL 查询
【发布时间】:2017-07-07 00:27:02
【问题描述】:

我需要一些关于 SQL 查询的帮助,我什至不知道如何命名这种 SQL 查询模式...我有以下简化表:

老师: 身份证 |姓名 1 |约翰 2 |保罗 教师_科目: TEACHER_ID | SUBJECT_ID 1 | 42 1 | 43 2 | 43 主题: 身份证 |姓名 42 |英语 43 |法语

这很容易:教师可以教授许多科目。现在,我需要找到所有既能教“英语”又能教“法语”(恰好是“约翰”)的老师。对此的 SQL 查询是什么?

【问题讨论】:

  • 您使用的是 MySQL 还是 Postgresql? (不要标记未涉及的产品。)
  • 有了那个表数据,预期的结果是什么? (在这里也指定为格式化文本。)
  • 这称为多对多关系。到目前为止,您尝试过什么?
  • 我实际上都在使用。在我的开发机器上我使用 Mysql,而在生产服务器上我将使用 Postgresql。虽然我更喜欢对两者都适用的解决方案,但严格的要求是查询可以在 Postgresql 上运行。预期的结果不是很重要,我的意思是,提取教师 ID 的查询对我来说已经足够了。当我需要教师姓名时,我可以编辑查询,这部分在我目前的能力范围内:)

标签: mysql sql database postgresql


【解决方案1】:

一种可能的解决方案是创建一个单独的查询来获取教授英语的教师和教授法语的教师。如果您同时拥有这两个集合,则可以使用 intersect 命令查找两个集合中都存在的集合。

对应的sql代码如下:

(SELECT teachers.name
FROM teachers, teachers_subjects, subjects
WHERE teachers.id = teachers_subject.id AND teachers_subjects.subject_id = subjects.id and subjects.name = "english")
INTERSECT
(SELECT teachers.name
FROM teachers, teachers_subjects, subjects
WHERE teachers.id = teachers_subject.id AND teachers_subjects.subject_id = subjects.id and subjects.name = "french")

【讨论】:

    【解决方案2】:

    JOIN 所有表格。类似的东西

    select t.Name
    from teachers t
    join teachers_subjects ts on t.id = ts.teacher_id
    join subject s1 on ts.subject_id = s1.id
    join subject s2 on ts.subject_id = s2.id
    where s1.NAME = 'English' and s2.NAME = 'French'
    

    【讨论】:

      【解决方案3】:

      我喜欢用group byhaving 来做这件事:

      select ts.teacher_id
      from teachers_subjects ts join
           subjects s
           on ts.subject_id = s.id
      where s.name in ('English', 'French')
      group by ts.teacher_id
      having count(*) = 2;  -- the teacher teaches both languages
      

      注意:如果你想在输出中加入教师姓名而不是 id,你可以加入教师姓名。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-25
        • 2013-10-16
        • 1970-01-01
        相关资源
        最近更新 更多