如何在mysql中的HAVING子句中使用AND条件?

时间:2011-10-12 08:01:54

标签: mysql database

我在数据库中有4个表,即employee_details_table (emp_no, emp_name, dept_no)department_table (dept_no, dept_name)grade_table (grade_id, grade_name)relation_table (emp_no, grade_id)

数据库结构的场景是: 我需要获得emp_name所有员工的dept_name(grade_id = 1 AND grade_id = 2 AND grade_id = 3),即所有3名员工grade_id。 (注意:可能有没有grade_id的员工。)

我的MySQL查询如下:

SELECT *, GROUP_CONCAT( grade_id ) AS gradeid
  FROM employee_details_table t1
  LEFT JOIN department_table t2
    USING ( dept_no )
  LEFT JOIN relation_table t3
    USING ( emp_no )
  LEFT JOIN grade_table t4
    USING ( grade_id )
  GROUP BY t1.emp_no
  HAVING grade_id = '1' OR grade_id = '2' OR grade_id = '3';

对于上面的查询,我将所有行作为输出。我也尝试使用AND代替OR,但我没有得到任何输出。我使用过WHERE IN (1,2,3)。我得到的行1 OR 2 OR 3grade_idWHERE IN(1 AND 2 AND 3)不起作用

请帮我更正查询。

1 个答案:

答案 0 :(得分:2)

应该做的诀窍:

SELECT *, GROUP_CONCAT( grade_id ) AS gradeid
  FROM employee_details_table t1
  LEFT JOIN department_table t2
    USING ( dept_no )
  LEFT JOIN relation_table t3
    USING ( emp_no )
  LEFT JOIN grade_table t4
    USING ( grade_id )
  WHERE grade_id IN ('1','2','3')
  GROUP BY t1.emp_no
  HAVING COUNT(DISTINCT grade_id) = 3;

首先,将所有至少有一个等级的员工带入有趣的(1,2和3),然后只保留具有三个不同等级的员工,这间接意味着他们拥有所有三个等级。如果你希望你的group_concat拥有所有成绩(包括那些不是1,2或3的成绩),你需要搞乱一个子查询,或者用一个“IF”语句做一些好的魔术。 HAVING子句。如果你愿意,我可以给你一个样本。