2012-04-15 23 views
0

我在学生表中列出了students,并在students_courses表中列出了他们的课程,并且这些课程中的每一个都可能处于活动状态或不活动状态。
我想知道是否有快速找到“活动”用户的方法,这意味着他们至少有1个活动课程(sc。active = 1)以及非活动用户。非活跃用户是那些没有课程(没有一排)或他们的所有课程都是active = 0使用MySQL查询查找在线学生和非在线学生

我也想获得实际列表之前的行数。
在此先感谢

+0

目前尚不清楚您是在两个单独的查询中还是在一个查询中(在这种情况下,行数将会是* all * students)。 – liquorvicar 2012-04-15 10:55:39

+0

@liquorvicar我不想在两个查询中。一个用于获取所有行。一个用于计算它们 – Sallar 2012-04-15 11:20:42

+0

您不需要两次查询就可以获取数据并计算出多少行。您有两种选择:在一个查询中获取所有数据(活跃和非活动学生)并在您的应用程序中计数(即使用PHP),或者在单独的查询中获得活跃和不活跃的学生,并分别计算每个查询的结果。 – liquorvicar 2012-04-15 11:27:45

回答

1

,因为它使用子查询,但假设你有一个字段studentId您可以使用此此查询可能会有点慢:

SELECT 
    students.*, 
    IF (
     studentId IN (
      SELECT 
       studentId 
      FROM 
       students_courses 
      WHERE 
       active=1 
    ),1,0) AS hasCourses 
FROM 
    students 
+0

这是否也适用于count(students。*)? – Sallar 2012-04-15 10:48:14

+0

只有将子查询移动到where子句时才会执行此操作。但是,你需要总共两个查询:一个检索学生(包括hasCourses),一个检索具有活动课程的学生的COUNT。然后你可以减去学生总数中的学生人数。不确定,但如果这是最好的方法。 – mistalee 2012-04-17 07:22:56

1
SELECT sum(students_courses.active) as sum, student_id FROM 
    students JOIN students_courses 
    ON students.student_id = students_courses.student_id 
    GROUP BY students_courses.student_id 

如果总和= 0,这意味着没有课程 并且其大于0表示一些课程

对于不活跃的用户获得所有不在student_course中的student_id

SELECT student_id FROM students WHERE student_id NOT IN 
    (SELECT DISTINCTROW student_id FROM students) 
+0

谢谢,我这样做,但我不想在PHP中做。我把它计算在mysql中。 “HAVING'不会计数(...) – Sallar 2012-04-15 10:46:07

+0

是的,那么HAVING是最好的选择...... – 2012-04-15 10:48:18