2012-04-15 41 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