1

我有两张桌子,

首先是 master_location:

此表由列 (id, location) 组成

  • 第 1 行,id = 1,位置 = X
  • 第 2 行,id = 2,位置 = Y
  • 第 3 行,id = 3,位置 = Z

第二个是 user_access

列(电子邮件,ID)

第 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

主位置

表 2:tm_access

访问权限

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

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';

结果

结果 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也应该删除

截屏:

在此处输入图像描述

4

3 回答 3

2

以下语句将返回ms_location其中没有对应行的所有行user_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 小提琴演示

于 2013-07-16T05:03:36.773 回答
1

你有一点猜测(我假设你的基数是 1..*),但我认为你要求的是一个结果集,显示没有关联的 user_access 记录的 ms_location 记录使用电子邮件地址“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')

如果我没有,不要。

于 2013-07-16T05:17:56.037 回答
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 链接

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

于 2013-07-16T05:24:52.173 回答