查询没有提供我想要的所需输出

时间:2017-12-11 06:48:14

标签: mysql sql

使用OR进行查询,输出错误

SELECT DISTINCT 
    sm___employees.id,
    sm___employees.employee_code,
    sm___employees.leaving_date,
    sm___employees.name_of_employee,
    sm___employees.position,
    sm___employees.rating,
    sm___employees.entry_date 
FROM 
    sm___employees 
JOIN 
    sm___employee_skills
ON 
    sm___employees.id=sm___employee_skills.employee_id
WHERE 
    ((sm___employee_skills.skill_id=1 AND sm___employee_skills.ans LIKE '%MBA%') 
    **OR**
    (sm___employee_skills.skill_id=5 AND sm___employee_skills.ans IN (3)))
    AND 
    sm___employees.rating IN (1) 
ORDER BY 
    sm___employee_skills.date DESC

但是我想要它和

SELECT DISTINCT 
    sm___employees.id,
    sm___employees.employee_code,
    sm___employees.leaving_date,
    sm___employees.name_of_employee,
    sm___employees.position,
    sm___employees.rating,
    sm___employees.entry_date 
FROM 
    sm___employees 
JOIN 
    sm___employee_skills 
ON 
    sm___employees.id=sm___employee_skills.employee_id 
WHERE 
    ((sm___employee_skills.skill_id=1 AND sm___employee_skills.ans LIKE '%MBA%') 
    **AND**
    (sm___employee_skills.skill_id=5 AND sm___employee_skills.ans IN (3)))
    AND 
    sm___employees.rating IN (1) 
ORDER BY 
    sm___employee_skills.date DESC

当我使用MBA或3的OR进行第一次查询时,它根据OR运算给出了两者的结果 我只想要那些拥有MBA和3的记录,当有这种比较的记录时,它会给我空白记录

所以请帮我解决这个问题。

提前谢谢

2 个答案:

答案 0 :(得分:1)

首先:DISTINCT通常表示编写错误的查询。这就是这种情况。您加入记录只是为了以后解雇它们。如果您需要员工记录,请从员工表中进行选择。如果您在技能表上有标准,请在WHERE子句中进行检查。不要加入。

然后WHERE子句一次查看一行。因此,skill_id = ... AND skill_id = ...skill_id = ... OR skill_id = ...都不适合您。你必须两次查看技能表:

SELECT 
  id,
  employee_code,
  leaving_date,
  name_of_employee,
  position,
  rating,
  entry_date
FROM sm___employees 
WHERE rating IN (1) 
AND id IN
(
  SELECT employee_id
  FROM sm___employee_skills
  WHERE skill_id = 1 AND ans LIKE '%MBA%'
)
AND id IN
(
  SELECT employee_id
  FROM sm___employee_skills
  WHERE skill_id = 5 AND ans IN (3)
);

这是一种只需查看一次技能的方法:

SELECT 
  id,
  employee_code,
  leaving_date,
  name_of_employee,
  position,
  rating,
  entry_date
FROM sm___employees 
WHERE rating IN (1) 
AND id IN
(
  SELECT employee_id
  FROM sm___employee_skills
  WHERE (skill_id = 1 AND ans LIKE '%MBA%')
     OR (skill_id = 5 AND ans IN (3))
  GROUP BY employee_id
  HAVING COUNT(DISTINCT skill_id) = 2 -- both skills
);

虽然您认为ans在一个地方(ans LIKE '%MBA%')是一个字符串而在另一个地方(ans IN (3))是一个数字,但这似乎很奇怪。

更新:如果您想按技能日期排序,则应考虑 技能的日期。为此,您将加入,但不加入技能表,但技能汇总结果。 E.g:

SELECT 
  e.id,
  e.employee_code,
  e.leaving_date,
  e.name_of_employee,
  e.position,
  e.rating,
  e.entry_date
FROM sm___employees e
JOIN
(
  SELECT employee_id, MAX(date) AS max_date
  FROM sm___employee_skills
  WHERE (skill_id = 1 AND ans LIKE '%MBA%')
     OR (skill_id = 5 AND ans = 3)
  GROUP BY employee_id
  HAVING COUNT(DISTINCT skill_id) = 2 -- both skills
) s ON s.employee_id = e.id
WHERE e.rating = 1
ORDER BY s.max_date;

答案 1 :(得分:-1)

请试试这个:

SELECT DISTINCT 
  sm1.id,
  sm1.employee_code,
  sm1.leaving_date,
  sm1.name_of_employee,
  sm1.position,
  sm1.rating,
  sm1.entry_date 
FROM sm___employees sm1 
LEFT JOIN sm___employee_skills sm2 ON sm1.id = sm2.employee_id
WHERE ((sm2.skill_id=1 AND sm2.ans LIKE '%MBA%') 
  AND (sm2.skill_id=1 AND sm2.ans=3)) 
  AND sm1.rating IN (1) 
ORDER BY sm2.date DESC;