【发布时间】:2019-12-07 07:37:55
【问题描述】:
我有一个使用常规 sql 表示法的查询,但很难将其转换为 laravel builder 表示法。
查询:
SELECT Course.CourseName
, SUM(CASE WHEN StudentID <> 0 THEN 1 ELSE 0 END) As InClass
, Instructor.InstructorFirstName
, ProgramName
, SemesterTaught
FROM program
JOIN course
ON program.ProgramID = course.ProgramID
JOIN (SELECT CourseID
, SemesterTaught
FROM classtime
GROUP BY CourseID, SemesterTaught) AS classtime
ON course.CourseID = classtime.CourseID
LEFT JOIN (SELECT InstructorID
, CourseID
, StudentID
FROM enrolled) AS enrolled
ON classtime.CourseID = enrolled.CourseID
LEFT JOIN instructor
ON enrolled.InstructorID = instructor.InstructorID
GROUP BY CourseName, InstructorFirstName, SemesterTaught, ProgramName
我尝试过的:
DB::table('programs')
->select('courses.CourseName', 'SUM(CASE WHEN StudentID <> 0 THEN 1 ELSE 0 END AS StudentsInClass', 'instructors.InstructorFirstName', 'ProgramName', 'SemesterTaught')
->join('courses', 'programs.ProgramID', '=', 'course.ProgramID')
->join(DB::raw('(SELECT CourseID, SemesterTaught FROM classtimes GROUP BY CourseID, SemesterTaught) AS classtimes'), 'courses.CourseID', '=', 'classtimes.CourseID')
->leftJoin(DB::raw('(SELECT InstructorID, CourseID, StudentID FROM enrolleds) AS enrolled'), 'classtimes.CourseID', '=', 'enrolled.CourseID')
->leftJoin('instructors', 'enrolled.InstructorID', '=', 'instructors.InstructorID')
->groupBy('courses.CourseName', 'instructors.InstructorFirstName', 'SemesterTaught', 'ProgramName')->get();
我想使用 laravel 查询构建器语法来实现这个查询,并尽可能避免使用 DB::raw。我还试图弄清楚如何在我的选择原因中使用聚合函数而不会出现“列不存在错误”。
【问题讨论】:
标签: sql laravel join subquery query-builder