如何在1个查询中执行此复杂提取?

时间:2012-02-14 09:57:05

标签: php mysql sql

我有一个应用程序,包括导师和课程,订阅者和评级。这些是我正在使用的表格:

tbl_tutors:
    id
    name

tbl_subscribers:
    id
    user_id
    course_id

tbl_courses:
    id
    name
    tutor_id

tbl_ratings:
    id
    user_id
    course_id
    rating

我需要有1位导师,他拥有的课程数量,这些课程的总订阅者数量以及所有课程的平均课程评分。这是很多数据;它可以在1 sql查询中完成,还是我需要在php中编写foreach语句来获得平均评分和这些课程的总订阅者?

2 个答案:

答案 0 :(得分:0)

select t.name "Tutor", count(c.id) "# courses", count(s.id) "# subscribers"
from tbl_tutors t, tbl_subscribers s, tbl_courses c, tbl_ratings r
where t.id = XXX
and c.tutor_id = t.id 
and s.course_id = c.id
and r.user_id = s.user_id
group by t.name

除了平均课程之外,这个sql将为您提供所需的一切(用您想要找到的教师ID替换XXX)。对于平均课程,您可以单独选择。

答案 1 :(得分:0)

您是否需要每个导师课程组合的总数或者辅导员级别的总分(和平均分)?

什么是在订阅者表中添加的评级表?它们不是唯一的用户课程组合吗?

如果一个用户由同一个导师参加多个课程,他们会将多少个订阅者视为?

@alfasin提供的SQL很容易扩展到所有导师。以下语法适用于SQL Server,您可能需要更改MySQL

Select t.name, count(distinct c.id) courseCount, count(s.id) subscribers, avg(r.rating) subRating  
From tbl_tutors t  
Inner join tbl_courses c on c.tutorid = t.id  
Inner join tbl_subscribers s on s.courseid = c.id  
Inner join tbl_ratings r on r.userid = s.userid and r.courseid = c.id  
Group by t.name  

请注意,在尝试构建这样的查询时,通常最好不要进行分组,这样您就可以检查哪些行对计数有贡献并确保包含您期望的所有内容'不重复结果