被MySQL子查询难住了
假设我有一张这样的桌子: 表用户注册被MySQL子查询难住了,mysql,Mysql,假设我有一张这样的桌子: 表用户注册 username role class John Doe student Algebra 1 Jane Duh student Algebra 1 Jeff Doh student Geometry Jack Sprat student Algebra 1 Willie Winky student Geometry Donald Duck teacher Algebra 1 Mickey Mouse
username role class
John Doe student Algebra 1
Jane Duh student Algebra 1
Jeff Doh student Geometry
Jack Sprat student Algebra 1
Willie Winky student Geometry
Donald Duck teacher Algebra 1
Mickey Mouse teacher Geometry
我想要这些结果:
# of students Class name Teacher name
3 Algebra 1 Donald Duck
2 Geometry Mickey Mouse
我将如何编写查询
(SELECT COUNT ue.username
FROM user_enrollments AS ue
WHERE ue.role="student") AS "# of Students",
ue.class AS "Class name",
(SELECT ue.username
FROM user_enrollments AS ue
WHERE ue.role="teacher") AS "Teacher name"
当然,上面的查询不起作用,但我不确定该采取什么方法
上表大大简化了。在我的实际示例中,该表是8个联接的结果。这更接近我真正的疑问:
(SELECT COUNT u.username
WHERE ra.roleid='5') AS "Number of Students",
c.fullname AS "Course name",
(SELECT u.username
WHERE ra.roleid='3') AS "Teacher name"
FROM prefix_user u
JOIN prefix_user_enrolments ue on ue.userid=u.id
JOIN prefix_enrol e ON e.id=ue.enrolid
JOIN prefix_course c on c.id = e.courseid
JOIN prefix_context AS ctx ON ctx.instanceid = c.id
JOIN prefix_role_assignments AS ra ON ra.contextid = ctx.id
JOIN prefix_role AS r ON r.id = e.roleid
JOIN prefix_course_categories AS cc ON cc.id=c.category
WHERE ra.userid=u.id
GROUP BY c.id
我知道子查询在编写时无法正常工作,但我不知道如何正确编写它们,我已经包含了WHERE子句,以便您了解我需要的要点
我也知道这似乎是在连接不必要的表,但其中一些表是连接两个不共享公共列的表所必需的
谢谢你的帮助!
金伯
- 现场观看它的工作
select class as [Class Name], username as [Teacher Name],
(
select count(username)
from table_user_enrollments
where role = 'student'
and class = e.class
) as [No of Student]
from table_user_enrollments e
where role = 'teacher'
这将为您提供您想要的:
select
count(t1.username) as "# of students",
t1.class as "class name",
t2.username as "Teacher name"
from
table_user_enrollments t1
left join
table_user_enrollments t2
on
t1.class = t2.class
where t1.role = 'student'
and t2.role = 'teacher'
group by t1.class
如果唐老鸭教我代数,我会非常喜欢。有时,一个更简单的解决方案会从更复杂的问题中显现出来:你的实际表的结构是什么?如果继续这样做,还可以避免形成一个工作查询,但却无法在真正的表上工作。这太棒了!我不知道表可以通过特定的值连接起来,比如在teachers.role='teacher'和student.role='student'上的内部连接。我只见过像老师一样的学生。如果您不介意解释一下,您使用的join语句会发生什么?我能看出它是有效的,但我不明白它为什么有效。我特别感谢包含到sqlfiddle的链接。谢谢实际上,你可以把
teachers.role='teacher'和students.role='student'
也放到where
子句中。我只是习惯于把逻辑放在它应该放的地方。有时,也需要将它们置于联接条件中,例如,当您左联接时。在where
子句中使用上述过滤器实际上会使左连接成为内部连接。这就是为什么我习惯了。下面是关于连接的一个很好的解释:
select
count(t1.username) as "# of students",
t1.class as "class name",
t2.username as "Teacher name"
from
table_user_enrollments t1
left join
table_user_enrollments t2
on
t1.class = t2.class
where t1.role = 'student'
and t2.role = 'teacher'
group by t1.class