我肯定有一个类似的问题已经被问过并回答过了,但是我还没有找到任何搜索中的东西,请温柔点。
我想知道数据库中所有在一幢楼的每个房间里教书的教员的名字。桌子空空如也,但它们是:
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 |
+---------+我想我只需要正确地加入。我所拥有的课程教材非常简陋,在概念教学方面也不多,所以我不知道在不同的情况下该由谁来运用它们。
发布于 2017-07-23 23:07:35
这里有一个查询,可以实现您所需的比较计数算法。这是戈登发表的文章的另一种选择
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关于你对戈登的回答的质疑,加入教职员工最安全的方法是:
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的
您应该避免尝试将he教员表加入到执行分组的内部查询中,因为这将迫使您向选择列表中添加更多列,这将迫使您向组中添加更多列,这会打破计数,最好将Gordon的查询视为独立运行的“教员查找器”,作为子查询并在稍后加入。
发布于 2017-07-23 22:59:33
你在找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表的问题。
发布于 2017-07-23 22:45:08
内线怎么样不然我就不明白你的问题了。
Select f.name from faculty f inner join class c on f.fid=c.fidhttps://stackoverflow.com/questions/45270485
复制相似问题