2011-10-01 61 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') 
       ) 
     )