MySQL WHERE 子句中的多个表

标签 mysql sql join

我得到了一个大学校友的 MySQL 数据库,其中记录了学生毕业后从事的职业。我关心三个表格(我已经简化了它们):

  1. 学生(学生 ID、毕业年份)
  2. 学生职业(学生 ID、职业名称、职业变更 1、职业变更 2)
  3. 职业分类(职业名称、部门、状态)

我正在制作一个网络表单,以便学院内的人员可以查询这些表格。特别是,他们想要选择毕业年份范围和职业名称,以询问“1970 至 1980 年间毕业的有多少人担任过学校教师?”之类的问题

我的 SQL 是:

SELECT COUNT(DISTINCT `Students`.`StudentID`) AS `Students`
FROM `Students`
INNER JOIN `StudentOccupations` ON `Students`.`StudentID`=`StudentOccupations`.`StudentID`
INNER JOIN `OccupationsClassified` ON  `StudentOccupations`.`OccupationName`=`OccupationsClassified`.`OccupationName` 
WHERE `Students`.`GraduationYear` BETWEEN 1970 AND 1980
AND 'School teacher' 
IN (`StudentOccupations`.`OccupationName`,`StudentOccupations`.OccupationChange1`, `StudentOccupations`.`OccupationChange2`);

该查询似乎没问题,但他们还想按部门搜索,并询问“1970 年至 1980 年间毕业的人有多少人在教育部门工作?”我希望用上面查询的前几行开始这个查询,因为然后我可以使用 PHP 条件构造查询(如果在表单中选择了这个元素,则添加这个 MySQL 子句等)。但我不知道该怎么做。

这是我最新的努力(它还没有计算记录,并且与上面的查询不同):

SELECT  `StudentOccupations`.`OccupationName`,`StudentOccupations`.`OccupationChange1`, `StudentOccupations`.`OccupationChange2`
FROM `StudentOccupations`
INNER JOIN `Students` ON `StudentOccupations`.`WebID` = `Students`.`WebID`
INNER JOIN `OccupationsClassified` ON `StudentOccupations`.`OccupationName`=`OccupationsClassified`.`OccupationName`
WHERE `Students`.`GraduationYear` BETWEEN 1970 AND 1980
AND EXISTS (SELECT `OccupationsClassified`.`OccupationName` FROM `OccupationsClassified` WHERE `OccupationClassified`.`Sector` = 'Education')

如你所见,我有点挣扎!有人知道如何按职业部门过滤结果吗?

最佳答案

您可以像这样加入所有职业的 OccupationsClassified:

SELECT
  COUNT(DISTINCT `Students`.`StudentID`) AS `Students`
FROM `Students`
  INNER JOIN `StudentOccupations` ON `Students`.`StudentID` = `StudentOccupations`.`StudentID`
  LEFT JOIN `OccupationsClassified` initialOc
    ON `StudentOccupations`.`OccupationName` = `OccupationsClassified`.`OccupationName`
  LEFT JOIN `OccupationsClassified` secondOc
    ON `StudentOccupations`.`OccupationChange1` = `OccupationsClassified`.`OccupationName`
  LEFT JOIN `OccupationsClassified` thirdOc
    ON `StudentOccupations`.`OccupationChange2` = `OccupationsClassified`.`OccupationName`
WHERE
  `Students`.`GraduationYear` BETWEEN 1970 AND 1980
  AND 'Education' IN (initialOc.Sector, secondOc.Sector, thirdOc.Sector);

或者因为您的 COUNT 中已经有一个 DISTINCT,您可以这样做

SELECT
  COUNT(DISTINCT `Students`.`StudentID`) AS `Students`
FROM `Students`
  INNER JOIN `StudentOccupations` ON `Students`.`StudentID` = `StudentOccupations`.`StudentID`
  INNER JOIN `OccupationsClassified` ON `OccupationsClassified`.`OccupationName` IN
                                        (`StudentOccupations`.`OccupationName`, `StudentOccupations`.`OccupationChange1`, `StudentOccupations`.`OccupationChange2`)
WHERE
  `Students`.`GraduationYear` BETWEEN 1970 AND 1980
  AND `OccupationsClassified`.`Sector` = 'Education';

关于MySQL WHERE 子句中的多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25148688/

相关文章:

MySQL连接三张表

database - 如何修复从远程服务器将 EE 数据库导入本地主机时收到的 #1062 错误

php - 在数据库中搜索某些内容 - 选择 - 需要在 2 个表中搜索

asp.net - SQL 存储过程中的 A-Z 循环

php - 学说条件连接

oracle - 改进连接时的搜索。簇表?

mysql - 如何通过显示最新行数据来使用组

php - 按顺序对输出进行编号

mysql - 当数据不为空时如何合并不同列的数据?

MySQL : How to find non duplicate rows with left join?