我在数据库中有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 3
为grade_id
。 WHERE IN(1 AND 2 AND 3)
不起作用
请帮我更正查询。
答案 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子句。如果你愿意,我可以给你一个样本。