显示ID不存在的列表

时间:2013-07-16 04:59:42

标签: mysql sql

我有两张桌子,

首先是 master_location:

此表由列(id,location)

组成
  • 第1行,id = 1,位置= X
  • 第2行,id = 2,位置= Y
  • 第3行,id = 3,位置= Z
第二是 的 user_access

列(电子邮件,身份证)

第1行=> me@localhost.host,1

我想显示主电子邮件地址“me @ localhost”不存在的所有其他位置。

我已经设置了sql:

 SELECT ml.idms_location, ml.location
 FROM ms_location ml JOIN user_access tu
 WHERE ml.id= tu.id
 AND !(tu.email = 'me@localhost.host'); 

但它只显示在表user_access中,其中的电子邮件不是me@localhost.host

有没有像SELECT ALL EXCEPT?

这样的SQL语法

感谢

更新

表1:master_location

master location

表格2:tm_access

tm acess

我按照建议写了语法结果:

SELECT DISTINCT ml.idms_location,ml.location
FROM ms_location ml
LEFT OUTER JOIN tm_userlocation tu
ON ml.idms_location = tu.idms_location
WHERE COALESCE(tu.email,'john@mscid.com') = 'john@mscid.com';

结果

result sql

使用此SQL语法:

SELECT ms.idms_location, ms.location
FROM ms_location AS ms LEFT JOIN tm_userlocation AS tu
ON ms.idms_location = tu.idms_location
WHERE tu.email !='john@mscid.com' OR tu.email IS NULL;

我执行的结果只是缺少第一个ID,没有。 3,没有。 5也应该删除

截图:

enter image description here

3 个答案:

答案 0 :(得分:2)

以下语句将返回ms_locationuser_access内没有相应行的所有行。

SELECT ml.idms_location,ml.location
FROM   master_location ml
WHERE  NOT EXISTS (
          SELECT *
          FROM   user_access tu
          WHERE  tu.idms_location = ml.idms_location
                 AND tu.email = 'john@mscid.com'
       )  

SQL Fiddle Demo

答案 1 :(得分:1)

你已经离开了一点猜测(我假设你的基数是1 .. *),但我认为你所要求的是一个结果集,显示ms_location记录没有关联的user_access记录,电子邮件地址为“me@localhost.host”。也就是说,根据您给定的示例数据,只有位置X具有与该电子邮件地址关联的user_access记录(它也是唯一的记录)。位置Y和Z没有与指定地址关联的user_access记录。这些是你想要的。

如果我正确地解释了你,试试这个:

SELECT ml.idms_location, ml.location
FROM ms_location ml
WHERE ml.id NOT IN (
  SELECT id FROM user_access WHERE email = 'me@localhost.host')

如果我没有,请不要。

答案 2 :(得分:0)

根据您的数据,您的查询应该是

select m.`id`, m.`location` from `master_location` as m 
WHERE 
m.`id` NOT IN ( select `id` from `user_access` WHERE `email` = 'john@mscid.com' ) ;

检查SQL Fiddle Link

http://sqlfiddle.com/#!2/28b50/3