mysql NOT IN查询

标签 mysql sql

我正在尝试生成有权访问特定位置的用户列表。在我看来,我数据库中记录用户可以访问的位置的表是倒退的。它列出了用户不能访问的位置。我已经尝试过not in 几种不同的方法,但都没有成功。该查询只返回一个空白结果集。我试过在这里找到一些可以帮助我的东西并用谷歌搜索,但这没有帮助......我总是得到空白的结果屏幕(没有返回)。我认为问题出在 USER_LOCATION_EXCLUSION 上,每个相应位置的每个 USER_ID 都有多个条目。这个表结构不是我创建的,而是继承的。

场景

Tables                  Columns
====================================================
APP_USER                USER_ID, USER_NAME    
LOCATION                LOCATION_ID, LOCATION_NAME    
USER_LOCATION_EXCLUSION USER_ID, LOCATION_ID

APP_USERLOCATION 表都有唯一的 ID。这些 ID 都在 USER_LOCATION_EXCLUSION(列出用户不能访问的位置)中使用,并且可以根据用户访问权限在此表中多次使用。我想生成包含他们有权访问的 USER_NAMELOCATION_NAME 的报告。

最佳答案

听起来你想要的是一个笛卡尔结果 LESS exclusions...即:对于每个用户,假设给他们每个位置访问权限,然后找出他们被排除在外的...

select
      PreQuery.User_ID,
      PreQuery.User_Name,
      PreQuery.Location_Name
   from
      ( select
               AU.User_ID,
               AU.User_Name,
               L.Location_ID,
               L.Location_Name
            from
               App_User AU,
               Location L ) PreQuery
         LEFT JOIN USER_LOCATION_EXCLUSION ULE
             on PreQuery.User_ID = ULE.User_ID
             AND PreQuery.LOCATION_ID = ULE.LOCATION_ID
       where
          ULE.Location_ID = NULL

通过对排除表进行左连接,每条记录都将尝试连接到排除列表中...因此,当它确实找到匹配项时,该位置 ID 将存在...当它不存在时,它将为空(满足您的 NOT Excluded from)

这也消除了为每个用户/位置测试的子选择 WHERE 子句

关于mysql NOT IN查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13364659/

相关文章:

mysql - 如何使用mysql从列中获取最频繁的值

php mysql比较两列返回不匹配

mysql - 如何对 "N-nearest neighbors?"执行多维搜索

java - 可能无法清理 java.sql.ResultSet 、 Statement。清理资源的义务并未解除

sql - 在同一选择中使用列别名

mysql - mysql查询中 "where(n) "到底是什么意思

mysql - 无法连接到通过 Homebrew 安装的 MySQL @127.0.0.1

php - 使用 CSS 在 PHP 中设置 MySQL 输出样式

mysql - SQL嵌套排序依据?

sql - 如何按 "all others"的前 N ​​个类别和总计进行聚合?