Mysql IN查询而不是多个AND条件

时间:2016-09-02 04:56:09

标签: php mysql

我有三个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) 

3 个答案:

答案 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

<强>解释

此查询将studentsstudent_category表连接在一起,然后删除所有非类别2或4的记录。这意味着每个学生只会将类别2和4记录关联到他。 HAVING子句然后通过要求学生具有两个不同的类别来进一步限制,如果为真,则必须表示学生 类别2和4 < / p>

在这里演示:

SQLFiddle

答案 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学生姓名,因为它会重复。