我需要使用INNER JOIN来获取一系列信息,然后我需要COUNT这个信息。我需要能够“查看所有课程和讲授课程的教师,课程的容量以及当前在课程上预订的会员数量。”
要获取所有信息,我已完成以下查询:
SELECT
C.coursename, Instructors.fname, Instructors.lname,C.maxNo, membercourse.memno
FROM Courses AS C
INNER JOIN Instructors ON C.instructorNo = Instructors.instructorNo
INNER JOIN Membercourse ON C.courseID = Membercourse.courseID;
但无论我把COUNT放在哪里,它总是告诉我COUNT之外的任何东西应该在GROUP BY中
我已经弄清楚如何按必要的信息COUNT / GROUP BY:
SELECT courseID, COUNT (DISTINCT MC.memno)
FROM Membercourse AS MC
GROUP BY MC.courseID;
但我不知道如何将两者结合起来!
答案 0 :(得分:0)
我认为你正在寻找的是一个子查询。我是一个SQL-Server人(不是postgresql),但在一些崩溃过程postgresql谷歌搜索后,这个概念看起来几乎完全相同。
无论如何,基本上,当您编写SELECT语句时,可以使用子查询而不是实际表。所以你的SQL看起来像:
select count(*)
from
(
select stuff from table
inner join someOtherTable
)
...希望这是有道理的。你没有尝试写一个大的查询来进行内部连接和计数,而是编写两个:一个是获取内部联接数据的内部数据,然后是一个外部数据。实际计算行数。
编辑:帮助解释一下子查询背后的思考过程。
子查询是逻辑上分解数据上的步骤/过程的一种方式。不是试图一步到位地完成所有事情,而是分步进行。
在这种情况下,第一步是什么?为您的内部联接数据组合获取合并数据源。
第1步:编写内部联接查询
SELECT
C.coursename, Instructors.fname, Instructors.lname,C.maxNo,
membercourse.memno
FROM Courses AS C
INNER JOIN Instructors ON C.instructorNo = Instructors.instructorNo
INNER JOIN Membercourse ON C.courseID = Membercourse.courseID;
好的,现在,下一步是什么?
嗯,让我们说我们想要计算每个' memno'在上面的结果中。
我们不是试图弄清楚如何修改上面的查询,而是将其用作数据源,就像它本身一样。
第2步 - 将其设为子查询
select * from
(
SELECT
C.coursename, Instructors.fname, Instructors.lname,C.maxNo,
membercourse.memno
FROM Courses AS C
INNER JOIN Instructors ON C.instructorNo = Instructors.instructorNo
INNER JOIN Membercourse ON C.courseID = Membercourse.courseID
) mySubQuery
第3步 - 修改外部查询以获取所需数据。
好吧,我们想按照' memno'进行分组,并获得点数,对吧?所以......
select memno, count(*)
from
(
-- all that same subquery stuff
) mySubQuery
group by memno
......有意义吗?一旦你的子查询被写出来,你就不用再担心了 - 你只是将它视为你正在使用的表格。
这实际上非常重要,并且可以更容易地阅读更复杂的查询 - 特别是因为您可以用解释子查询表示数据方式的方式来命名子查询。
答案 1 :(得分:0)
有很多方法可以解决这个问题,例如使用Window Functions等。但您也可以使用简单的子查询来实现它:
SELECT
C.coursename,
Instructors.fname,
Instructors.lname,
C.maxNo,
(SELECT
COUNT(*)
FROM
membercourse
WHERE
C.courseID = Membercourse.courseID) AS members
FROM
Courses AS C
INNER JOIN Instructors ON C.instructorNo = Instructors.instructorNo;