2011-10-01 63 views
-1

我有以下問題。有兩個表 - groupsstudents和第三數據透視表group_student多對多查詢過濾器

查詢來獲取來自特定羣體(ID:1,8)學生清楚......

SELECT DISTINCT s.* 
    FROM students AS s 
    Inner Join group_student AS gs ON gs.student_id = s.id 
    Inner Join groups AS g ON g.id = gs.group_id 
    WHERE g.id IN ("1","8") 

它的工作原理。但是,如何查詢,如果我想只選擇組ID爲1的學生的片段。例如s.name = "john"。所以結果應該是:all students from group id 8 + all students with name "john" from group id 1

感謝名單上崗:-)

回答

2

試試這個:

SELECT DISTINCT s.* 
    FROM students AS s 
    Inner Join group_student AS gs ON gs.student_id = s.id 
    Inner Join groups AS g ON g.id = gs.group_id 
    WHERE g.id ="8" or (g.id="1" and s.name = "john") 
+0

它會一次選擇一個數據集,而不是兩個 – diEcho

+1

不知道你的評論意味着什麼,上面的工作就會很好...... – Sparky

+0

@Sparky:你的意思是'g.id =「1」'off off course,not' gp.id = 「1」' –

1

你可以使用UNION太

SELECT DISTINCT s.* 
    FROM students AS s 
    Inner Join group_student AS gs ON gs.student_id = s.id 
    Inner Join groups AS g ON g.id = gs.group_id 
    WHERE g.id = 8 
UNION 
SELECT DISTINCT s.* 
    FROM students AS s 
    Inner Join group_student AS gs ON gs.student_id = s.id 
    Inner Join groups AS g ON g.id = gs.group_id 
    WHERE gp.id="1" and s.name = "john" 
0

還有一個選項,避免DISTINCT和(可能是不需要的)加入到groups

SELECT s.* 
FROM students AS s 
WHERE EXISTS 
     (SELECT * 
      FROM group_student AS gs 
      WHERE gs.student_id = s.id 
      AND ( gs.group_id = 8 
       OR (gs.group_id, s.name) = (1, 'john') 
       ) 
     )