【问题标题】:Select ROW if not in another query如果不在另一个查询中,请选择 ROW
【发布时间】:2013-01-04 16:56:43
【问题描述】:

我有这个问题:

query 1 = 
SELECT emp.employeId,emp.nom,emp.prenom,msg.note,msg.quelleDate, emp.remarques, emp.autonome, embauche.actif as embaucheActif, embauche.embId, 'M' as source 
FROM employes emp 
LEFT JOIN messages msg ON msg.employeId = emp.employeId 
LEFT JOIN embauche ON embauche.employeId = emp.employeId 
WHERE emp.actif = 1 
AND msg.quelleDate BETWEEN '2013-01-01' AND '2013-01-31' 

UNION 

SELECT emp.employeId,emp.nom,emp.prenom,msg.note,msg.quelleDate, emp.remarques, emp.autonome, embauche.actif as embaucheActif, embauche.embId, 'A' as source 
FROM employes emp 
LEFT JOIN messagesautre msg ON msg.employeId = emp.employeId 
LEFT JOIN embauche ON embauche.employeId = emp.employeId 
WHERE emp.actif = 1 
AND msg.quelleDate BETWEEN '2013-01-01' AND '2013-01-31' 

ORDER BY nom,prenom,quelleDate

还有这个查询

query2 = select nom,prenom from employes where actif = 1;

我正在尝试从query2 获取所有没有出现在query1 中的employeeId

我试过了

select employeId,nom,prenom from employes where actif = 1 AND employeId in ( query1 );

但这当然行不通,因为 query1 返回超过 1 列

是否可以使用 MySQL 查询来做到这一点?还是我必须编写 PHP 算法才能做到这一点??

【问题讨论】:

  • 能否提供表结构和示例数据?它可能有助于解决您的问题。
  • 查看我编辑后的链接
  • 谢谢。我自己已经创造了一些东西。但是我的法语不是很好,所以我需要做一些猜测。

标签: php mysql sql web


【解决方案1】:

您在第二个查询中对第一个查询中的表的条件。雇员表中是否有重复的名字和名字?如果没有,您可以在每个 where 子句中添加以下内容:

and emp.Active = 1

如果ActifActive 相同,那么您将永远不会得到任何行。

更通用的方法是在 where 子句中添加以下内容:

and not exists (select 1 from employes emp2 where emp2.prenom = emp.prenom and emp2.nom = emp.prenom)

【讨论】:

  • 我的 bad、actif 和 active 应该是一样的......我会解决这个问题。
  • 我建议一个“更通用”的方法如下:SELECT * FROM (query2) x LEFT JOIN (query1) y ON y.id = x.id WHERE y.id IS NULL;跨度>
  • 两种方法都给了我完全相同的结果:我仍然缺少一些员工。
  • 我想帮忙。不幸的是,如果不巧妙地改变物理定律,我就无法复制这一发现!
【解决方案2】:

这样做是不是很简单:

select nom,prenom from employes AS emp 
LEFT JOIN embauche AS emb  
ON emp.employeID = emb.employeID
LEFT JOIN messages AS msg
ON emp.employeID = msg.employeID
where actif <> 1
AND msg.quelleDate NOT BETWEEN '2013-01-01' AND '2013-01-31';

样本数据:

CREATE TABLE employes (
  employeId int auto_increment primary key,
  nom varchar(30),
  prenom varchar(30),
  remarques longtext,
  autonome longtext
  );

CREATE TABLE messages (
  messagesID int auto_increment primary key,
  employeId int,
  quelleDate DATE,
  note longtext

  );

CREATE TABLE embauche(
  embId int auto_increment primary key,
  employeID int,
  actif int
  );

INSERT INTO employes (nom,prenom,remarques,autonome)
VALUES ("hollande", "francois", "24th President of France", "?"),
("Sarkozy", "Nicolas", "23th President of France", "?");


INSERT INTO messages (employeId,quelleDate,note)
VALUES (1, now(),"jlkjlkahkjhkj"),
(2,NOW() - INTERVAL 365 DAY,"jlkjlkahkjkjjhajhjheuioueoijhkj");


INSERT INTO embauche (employeId,actif)
VALUES (2, 2),
(1,1);

Demo sql fiddle

【讨论】:

  • @PL Audet 我没有在回答中解释它,但我所做的基本上是把 where 子句转过来。所以,如果你的第一个查询想要一个肯定的,我变成了否定的。很高兴能帮到你。
  • 好主意。我不明白为什么这个问题在一个地方寻找活动物而不在另一个地方寻找活动物。我想这就是问题所在。
  • @GordonLinoff 一开始我也遇到了同样的问题。这就是我以“是否简单”开始回答的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2011-03-13
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 2016-04-24
  • 2013-03-08
相关资源
最近更新 更多