MySQL:选择与多个ID匹配的所有记录

时间:2014-02-18 00:38:58

标签: mysql sql join

这是基于已回答here的问题。

我需要将关系记录导出为平面CSV文件。它显示了符合两种技能的员工列表。出口需要为每种技能分别设置一条线。例如:

EMPID  NAME               SKILLNAME  LEVEL
1      Fred Flintstone    PHP        Basic
1      Fred Flintstone    JQuery     Advanced
3      Steve Jobs         PHP        Basic
3      Steve Jobs         JQuery     Advanced

以下是表格/记录和上一个答案的修改版本:SQL Fiddle

我尝试了一些变化,但没有运气。

由于

4 个答案:

答案 0 :(得分:1)

您需要一个子查询来查找拥有2项以上技能的员工。然后,您只需将其加入Emp_skills表中即可列出这些技能的详细信息。

SELECT Emp_SKills.*
FROM Emp_Skills
JOIN (
SELECT COUNT(*) as skills, Emp_ID
FROM Emp_Skills
GROUP BY Emp_ID
HAVING skills > 1
) as mult ON mult.Emp_ID = Emp_Skills.Emp_ID
ORDER BY Emp_SKills.Emp_ID

答案 1 :(得分:0)

你去了一个子查询

SELECT a.Emp_ID, b.Name, c.Name as skname, a.Level
FROM Emp_Skills a
LEFT JOIN Employee b
ON a.Emp_ID = b.ID
LEFT JOIN Skill c
ON a.Skill_ID = c.ID
WHERE ( 
       SELECT count(d.Emp_Id) as total 
       FROM Emp_Skills d
       WHERE d.Emp_id = a.Emp_id 
       GROUP BY Emp_id
      ) > 1
ORDER BY a.Emp_ID ASC

Sql fiddle here

基于操作新信息

SELECT a.Emp_ID, b.Name, c.Name as skname, a.Level
FROM Emp_Skills a
LEFT JOIN Employee b
ON a.Emp_ID = b.ID
LEFT JOIN Skill c
ON a.Skill_ID = c.ID
WHERE ( 
       SELECT count(d.Emp_Id) as total 
       FROM Emp_Skills d
       WHERE d.Emp_id = a.Emp_id 
       GROUP BY Emp_id
      ) > 1
AND a.Skill_ID IN ('1', '2')
ORDER BY a.Emp_ID ASC

新的sql fiddle here

答案 2 :(得分:0)

select a.emp_id, b.name, c.name as skname, a.level
  from emp_skills a
  join employee b
    on a.emp_id = b.id
  join skill c
    on a.skill_id = c.id
 where b.id in (select emp_id from emp_skills where skill_id = '1')
   and b.id in (select emp_id from emp_skills where skill_id = '2')
   and a.skill_id in ('1', '2')

* SQL FIDDLE:http://sqlfiddle.com/#!2/35fe1/40/0 *

答案 3 :(得分:0)

感谢Fabio,我能够根据他的回答找到解决方案。最后的查询是:

SELECT a.Emp_ID, b.Name, c.Name as skname, a.Level
FROM Emp_Skills a
LEFT JOIN Employee b
ON a.Emp_ID = b.ID
LEFT JOIN Skill c
ON a.Skill_ID = c.ID
WHERE ( 
       SELECT count(d.Emp_Id) as total 
       FROM Emp_Skills d
       WHERE d.Emp_id = a.Emp_id 
       GROUP BY Emp_id 
       AND d.Skill_ID IN ('1', '2')
      ) = 2
AND a.Skill_ID IN ('1', '2')
ORDER BY a.Emp_ID ASC

我已添加

AND d.Skill_ID IN ('1', '2')
,因此它只会找到具有所选技能的员工。我并不关心我所寻找的技能,而不关心员工的技能总数。我也改变了'> 1'到'= 2'。这将随着搜索技能的数量而变化。因此,如果我正在寻找具有4种特殊技能的员工,那么它将是'= 4'。

谢谢大家。