我有三个mysql表,category,students和student_category。对于每个学生,将有一个或多个类别,它存储在student_category中,如下所示。
1) Categgory
----------------------------
id | category_name
---------------------------
1 | A
2 | B
3 | C
4 | D
2) Students
--------------------------
id | name
--------------------------
1 | John
2 | Kumar
3 | Ashok
4 | Jorge
5 | Suku
-------------------------
2) student_category
-----------------------------------------
id | student_id | category_id
-----------------------------------------
1 | 1 | 2
2 | 1 | 4
3 | 2 | 3
4 | 2 | 1
5 | 3 | 2
------------------------------------------
我需要选择包含category_id 2和4的学生。
我使用了如下查询,但它返回的学生包含类别2或类别4.
select A.name from students A, student_category B where A.id=B.student_id
and B.category_id IN (2,4)
答案 0 :(得分:3)
尝试此查询:
SELECT t1.id,
t3.name
FROM students t1
INNER JOIN student_category t2
ON t1.id = t2.student_id
INNER JOIN students t3
ON t1.id = t3.id
WHERE t2.category_id IN (2, 4)
GROUP BY t1.id
HAVING COUNT(DISTINCT t2.category_id) = 2
<强>解释强>
此查询将students
和student_category
表连接在一起,然后删除所有非类别2或4的记录。这意味着每个学生只会将类别2和4记录关联到他。 HAVING
子句然后通过要求学生具有两个不同的类别来进一步限制,如果为真,则必须表示学生 类别2和4 < / p>
在这里演示:
答案 1 :(得分:0)
试试这个:
select name from Students where id in (select student_id from student_category where category_id in (2,4))
你的查询很好。
答案 2 :(得分:0)
试试这个:
select
s.name
from
Students s,
Categgory c,
student_category sc
where
sc.student_id = s.id
and sc.category_id = c.id
and c.id = 2
and c.id = 4
您可以在SQL Fiddle上查看。
如果学生属于多个类别,则必须取distinct
学生姓名,因为它会重复。