Sql 从另一个表中选择max
我需要一些数据库方面的帮助,在学校我们必须使用Fox Pro,我知道它很旧,但我能做什么,其中一项任务是:列出每位老师最长的课程 我们的桌子是空的 课程->idc主键、id、名称、长度 教师->id主键,名称 使用select命令有没有办法做到这一点?我相信最终教师会有两个专栏。name和courses.name。。。我的意思是,老师必须是独一无二的,旁边有一个最大的课程,但只有他/她所教的课程 我试过: 1从教师、教师所在的课程中选择教师。名称、课程。名称、MAXcourses.legth。id=courses.id-->错误 2从教师、课程所在的课程中选择教师。名称、课程。名称。长度=从课程和课程中选择MAXcourses.length。id=教师。id-->仅显示最长的课程 3制作一个类似以下内容的程序:Sql 从另一个表中选择max,sql,database,foxpro,Sql,Database,Foxpro,我需要一些数据库方面的帮助,在学校我们必须使用Fox Pro,我知道它很旧,但我能做什么,其中一项任务是:列出每位老师最长的课程 我们的桌子是空的 课程->idc主键、id、名称、长度 教师->id主键,名称 使用select命令有没有办法做到这一点?我相信最终教师会有两个专栏。name和courses.name。。。我的意思是,老师必须是独一无二的,旁边有一个最大的课程,但只有他/她所教的课程 我试过: 1从教师、教师所在的课程中选择教师。名称、课程。名称、MAXcourses.legth。i
BOF()
i=1
CALCULATE MAX(teachers.id) TO y
DO WHILE i<y
IF teachers.id=i
x=SELECT MAX(courses.legth) FROM courses,teachers WHERE teachers.id=i
LIST teachers.name,courses.name FOR courses.legth=x
SKIP
i=i+1
ENDIF
ENDDO
-->那一个永远没有结果
过了一段时间,我终于想办法解决这个问题,但我确信一定有更好的办法:
i=1
USE teachers
CALCULATE MAX(id) TO y
USE
DO WHILE i<=y
USE courses
CALCULATE MAX(length) FOR id=i TO x
USE
USE teachers
LIST name for id=i
USE
USE courses
LIST name for id=i AND length=x
USE
i=i+1
ENDDO
谢谢。是的,其他人给了你一段艰难的时光,但现在你知道要展示你为解决问题认真尝试过的东西了。虽然没有一个对你有用,但我会尽力帮助你,边走边解释 首先,单独从课程表开始,因为它有我们可以处理的教师ID。这是一个简单的GROUPBY子句
select ;
c.id, ;
max( c.length ) as CourseMaxLen ;
from ;
courses c ;
group by ;
c.id ;
into ;
cursor C_MaxCoursePerTeacher
然后,您可以浏览此结果以查看。现在,你有一个非常简单的查询每个老师。然后,您可以以此为基础连接到教师表以获取教师姓名。然后根据教师和课程长度再次连接回原始课程表。但是,如果您的老师有多个相同长度的课程,则会返回每个相同长度的课程
select
CMax.ID, ;
T.Name as TeacherName, ;
c2.Name as CourseName,;
c2.Length ;
from ;
( select ;
c.id, ;
max( c.length ) as CourseMaxLen ;
from ;
courses c ;
group by ;
c.id ) CMax ;
JOIN Teachers t ;
on CMax.ID = t.id ;
JOIN Courses c2 ;
on CMax.ID = c2.ID ;
AND CMax.CourseMaxLen = c2.Length
请注意,与课程c2的连接由教师ID和内部查询确定的最大长度决定。试着一次一个地解决你的难题,然后根据需要混合在一起
在VFP中为您提供的附加选项。。。在学习过程中,构建片段并将其查询到临时游标中,以便用于下一步。工作示例也可以像使用原始查询一样完成
INTO CURSOR
C_MaxCoursePerTeacher
然后使用它作为连接,例如
select
CMax.ID, ;
T.Name as TeacherName, ;
c2.Name as CourseName,;
c2.Length ;
from ;
C_MaxCoursePerTeacher CMax ;
JOIN Teachers t ;
on CMax.ID = t.id ;
JOIN Courses c2 ;
on CMax.ID = c2.ID ;
AND CMax.CourseMaxLen = c2.Length
这样,你就可以一次完成一个工作查询,知道它的目的是什么,然后进入下一个谜题。尝试列出所有带长度的教师课程组合,然后列出谷歌组BY@GoatCO我不知道,因为我真的不知道。为什么这么短的问题看起来更微妙。。。无论如何,你们应该能够列出每位老师最长的课程长度,然后更新你们关于如何包括课程名称的问题。@manuell相信我,我已经考虑了好几个小时了,我想不出来。在select中,您确实可以计算出最长的课程,但当您添加另一列时,会出现错误。我曾想过制作一个.prg,但即使这样,它也相当复杂,因为我必须同时通过两个表格,通过第二个表格,teachers.id times…更新你的问题,显示你做了什么/尝试了什么。只做我的家庭作业不太可能让你得到答案,我不能太感谢你:我不知道这在FoxPro中是否有效,但它确实对我个人有帮助。@user3264023,修改后的答案,通过一件一件地做来展示另一种方法。