Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
被MySQL子查询难住了_Mysql - Fatal编程技术网

被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