Mysql 查询没有给出我想要的结果

Mysql 查询没有给出我想要的结果,mysql,sql,Mysql,Sql,查询哪个输出错误或哪个输出错误 但我希望它能在 当我使用MBA或3中的OR进行第一次查询时,它会根据OR操作给出正确的结果 我只想要那些有MBA学位的记录和3,当有可供比较的记录时,3会给我空白记录 所以请帮我解决这个问题 先谢谢你首先:DISTINCT通常表示查询写得不好。这里就是这样。您加入记录只是为了稍后将其删除。如果需要员工记录,请从员工表中选择。如果技能表中有条件,请在WHERE子句中选中此项。不要加入 然后WHERE子句一次查看一行。所以这两项技能都不是。。。和技能_id=。。。也不

查询哪个输出错误或哪个输出错误

但我希望它能在

当我使用MBA或3中的OR进行第一次查询时,它会根据OR操作给出正确的结果 我只想要那些有MBA学位的记录和3,当有可供比较的记录时,3会给我空白记录

所以请帮我解决这个问题


先谢谢你

首先:DISTINCT通常表示查询写得不好。这里就是这样。您加入记录只是为了稍后将其删除。如果需要员工记录,请从员工表中选择。如果技能表中有条件,请在WHERE子句中选中此项。不要加入

然后WHERE子句一次查看一行。所以这两项技能都不是。。。和技能_id=。。。也不是技能\u id=。。。或技能\u 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在一个地方是一个字符串,比如“%MBA %”,而另一个ANS中的数字是3。 <>更新:如果你想按技能日期排序,你应该考虑哪个技能的日期。为了实现这一点,您将加入,但不加入技能表,而是加入技能聚合结果。例如:

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;
请试试这个:

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;

发布一些与您的表相关的示例数据这是否意味着数据位于两个不同的记录中,并且您希望在这些记录中匹配条件,例如,查找同时具有这两个记录的员工?表1-sm\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,日期:::这两个表是我使用的,我从中共享技能id、es表中的ans和员工的评级table@Prajakta当前位置您注意到您没有回答Shadow的问题,是吗?问:你想要有两个特定技能记录的员工记录吗?答:我有两个表。搞什么鬼?你明白哈立德·朱奈德先生要你做什么吗?您无法正确地解释所需的内容,因此显示两个表和预期结果行的一些示例记录可能会有所帮助。请考虑使用代码块来格式化您的答案,这将更容易从您的代码中格式化。然而,这仍然只是代码,没有答案。为什么OP要尝试这个?您在他们的查询中发现了什么缺陷?你是如何回避这个问题的?在我看来,您的查询无法工作,因为ans不能是3并且同时匹配“%MBA%”。您为什么在某处使用IN 3并在其他地方使用=3?@Rafalon:IN 3是从OP的查询中复制的3是我们通常只用于一个值的值。这就是我所想的,我对使用IN表示一个值感到非常困惑,所以我想知道这背后是否有任何性能问题。谢谢试过你的第一个代码,它使用了子查询而不是连接,但是也不起作用,结果和我的queryNo一样,你错了。您的AND查询无法返回行。OR查询返回技能为1或5或两者兼有的员工。我的查询只返回同时具备技能1和技能5的员工。
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;
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;