我正在尝试生成有权访问特定位置的用户列表。在我看来,我数据库中记录用户可以访问的位置的表是倒退的。它列出了用户不能访问的位置。我已经尝试过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_USER
和 LOCATION
表都有唯一的 ID。这些 ID 都在 USER_LOCATION_EXCLUSION
(列出用户不能不访问的位置)中使用,并且可以根据用户访问权限在此表中多次使用。我想生成包含他们有权访问的 USER_NAME
和 LOCATION_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/