使用内部联接和子查询的mysql查询

时间:2014-01-30 17:47:35

标签: mysql sql join inner-join

这些是表格:

professor:
+-------+--------+--------+--------+------+
| empid | name   | status | salary | age  |
+-------+--------+--------+--------+------+
|     1 | Arun   |      1 |   2000 |   23 |
|     2 | Benoy  |      0 |   3000 |   25 |
|     3 | Chacko |      1 |   1000 |   36 |
|     4 | Divin  |      0 |   5000 |   32 |
|     5 | Edwin  |      1 |   2500 |   55 |
|     7 | George |      0 |   1500 |   46 |
+-------+--------+--------+--------+------+
works:
+----------+-------+---------+
| courseid | empid | classid |
+----------+-------+---------+
|        1 |     1 |      10 |
|        2 |     2 |       9 |
|        3 |     3 |       8 |
|        4 |     4 |      10 |
|        5 |     5 |       9 |
|        6 |     1 |       9 |
|        2 |     3 |      10 |
|        2 |     1 |       7 |
+----------+-------+---------+

course:
+----------+------------+--------+
| courseid | coursename | points |
+----------+------------+--------+
|        1 | Maths      |    100 |
|        2 | Science    |     80 |
|        3 | English    |     85 |
|        4 | Social     |     90 |
|        5 | Malayalam  |     99 |
|        6 | Arts       |     40 |
+----------+------------+--------+

问题是:

  

返回教授数学或科学课程的员工名单,但是   不是两个

我写的查询是:

select distinct professor.name from professor
inner join works
on professor.empid=works.empid
where works.courseid in
(select courseid from course where coursename ='Maths' or coursename='Science'); 

我收到的输出是:

Arun
Benoy
Chacko

在这里,员工'Arun'不应该像数学和科学一样被展示出来。

请帮帮我!!

2 个答案:

答案 0 :(得分:3)

您可以使用汇总COUNT()来检查所教授的DISTINCT课程总数是否为1,同时仍然会过滤到两种不同类型的课程。这确保只返回一个,而不是两个。

因为IN ()限制了最初只返回两个所需课程的所有行,所以教授最多可以通过COUNT(DISTINCT coursename)获得2个不同的课程。然后,HAVING子句禁止最终结果集中包含2的那些。

SELECT
  DISTINCT professor.name
FROM
  professor
  INNER JOIN works ON professor.empid = works.empid
  /* Join against course to get the course names */
  INNER JOIN course ON works.courseid = course.courseid
WHERE
  /* Restrict only to Maths, Science */
  course.coursename IN ('Maths', 'Science')
GROUP BY professor.name
/* Only those with exactly one type of course */
HAVING COUNT(DISTINCT course.coursename) = 1

以下是演示:http://sqlfiddle.com/#!2/2e9610/2

答案 1 :(得分:0)

您想在此使用xor而不是or

select distinct professor.name from professor
inner join works
on professor.empid=works.empid
where works.courseid in
(select courseid from course where coursename ='Maths' xor coursename='Science');