我确定已经有人问过并回答了类似的问题,但我还没有找到任何搜索内容,请保持温和。
我想知道数据库中教师的所有名字,他们在建筑物的每个房间里教书。这些表非常简单,但它们是:
class:
+--------+---------+------+------+
| cname | meetsat | room | fid |
+--------+---------+------+------+
| class | 8 | R128 | 5 |
| class2 | 9 | R129 | 6 |
| class3 | 9 | R128 | 5 |
+--------+---------+------+------+
faculty:
+-----+---------------+--------+
| fid | fname | deptid |
+-----+---------------+--------+
| 5 | i.teach | 999 |
| 6 | other guy | 998 |
| 8 | another woman | 997 |
+-----+---------------+--------+
到目前为止,通过与其他用户的讨论,我有:
(SELECT f.fname
FROM faculty f, class c
WHERE f.fid = c.fid)
UNION
(select c.fid
from class c
group by c.fid
having count(distinct room) = (select count(distinct c2.room) from class
c2));
当前输出: + ----------- + | fname | + ----------- + | i.teach | |其他人| + ----------- +
期望的输出应该是:
+---------+
| fname |
+---------+
| i.teach |
+---------+
我想我只需要正确加入。我所拥有的课程资料非常简陋,在概念教学方面并不多,所以我不知道在不同的情况下应用它们的人。
答案 0 :(得分:1)
您正在寻找having
:
select c.fid
from class c
group by c.fid
having count(distinct c.room) = (select count(distinct c2.room) from class c2);
获取名称只需加入faculty
表。
答案 1 :(得分:1)
这是一个可以执行您需要的查询,实现比较计数的算法。它是Gordon发布的HAVING的替代品
SELECT * FROM
(SELECT count(distinct room) as countAllRooms FROM class) ar
INNER JOIN
(SELECT c.fid, count(distinct c.room) as countRoomsPerTeacher FROM class c GROUP BY c.fid) rpt
ON
rpt.countRoomsPerTeacher = ar.countAllRooms
INNER JOIN
faculty f
ON
f.fid = rpt.fid
关于您对Gordon答案的查询,加入教师表的最安全方式:
Select * from faculty inner join
(
select c.fid
from class C
group by c.fid
having count(distinct room) = (select count(distinct c2.room) from class c2)
) ff
on ff.fid = faculty.fid
我通常不会格式化这样的sql,但我故意这样做是为了显示我添加的位和哪些位是Gordon的
你应该避免尝试将他的教师表加入到进行分组的内部查询中,因为它会强制你在选择列表中添加更多列,这会强制你向你的组添加更多列,这会打破你的计数,更好地考虑戈登的查询“教师发现者”,作为子查询孤立运行,并在以后加入
答案 2 :(得分:0)
内部加入怎么样,或者我不明白你的问题。
Select f.name from faculty f inner join class c on f.fid=c.fid