MySQL连接3个表并在一张表中找到 "missing"行

标签 mysql join not-exists

我在 MySQL 中有 3 个表,我需要查找用户没有特定小部件的所有实例。

示例:

Users
tenant_id user_id user_name
1         1       Bob
1         2       Fred
1         3       John
1         4       Tom

Widgets
tenant_id widget_id widget_name
1         1         Red
1         2         Blue
1         3         Green
1         4         Black

Usage
tenant_id user_id widget_id
1         1       1
1         1       2 
1         1       4
1         2       2
1         2       3
1         2       4
1         3       1
1         3       2
1         3       3
1         3       4
1         4       1
1         4       2
1         4       3

Missing in table three are:
user_name widget_name
Bob       Green
Fred      Red
Tom       Black

我尝试使用的查询是:

SELECT
  user_name, widget_name
FROM
  users left join widgets on users.tenant_id=widgets.tenant_id
WHERE 
  NOT EXISTS (
    SELECT 1 FROM usage WHERE user_id = users.user_id AND widget_id = widgets.widget_id
  ) and users.tenant_id=1

当查询完成时,它会返回一个巨大的用户名和小部件名称列表,但比我预期的要多数百个。

我不确定连接是否错误或者我是否需要对结果进行某种分组?

最佳答案

这是此类查询背后的想法。首先生成用户和小部件的所有可能组合。然后过滤掉存在的:

select u.user_name, w.widget_name
from users u join
     widgets w
     on u.tenant_id = w.tenant_id
where not exists (select 1
                  from usage us
                  where us.user_id = u.user_id and us.widget_id = w.widget_id and
                        us.tenant_id = u.tenant_id
                 ) and
      u.tenant_id = 1;

我认为您的逻辑缺少 usage 表中的 tenant_id。但是,我不确定这会产生很大的差异。

关于MySQL连接3个表并在一张表中找到 "missing"行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36769241/

相关文章:

mysql - 计算连接排列的行数

Mysql 在选择非索引字段时不使用索引

php - Propel 正在丢失查询参数

mysql - 有没有办法在 MySQL 中对两列的乘积求和?

asp.net-mvc - MVC LINQ to SQL 表连接记录显示

java - 如何在 hadoop 中管理连接 - MultipleInputPath

MySQL INSERT 如果主键值之一不匹配

mysql - 如果同时请求,Sql Update Statements 是否同时运行?

mysql:如果表B中不存在,则从表A中选择所有项目

mysql - 如果不存在则不工作