【问题标题】:Mysql where (in) statement of another table without joinsMysql where(in) 另一个没有连接的表的语句
【发布时间】:2016-03-31 18:09:15
【问题描述】:

我有 2 个表 A 和 B,它们都有相同的数据,因为表 B 也有一个“包含”列。

如果包含为 1 的表 B 中存在相同的 A.user_id + A.code 组合,我想选择表 a 中的所有 a.code 和 a.user_id 条目,那么我不想返回这些表 A 中的值。

首先我尝试用这个来修复它:

SELECT a.code, a.user_id
LEFT JOIN B ON a.code = b.code
FROM A a WHERE b.include != 1

这不起作用,因为代码字段在表 B 中多次存在,所以我得到了很多结果。

最终我想出了这个,但我不确定这是否是最好的解决方案,甚至是正确的。

SELECT a.code, a.user_id
FROM A a WHERE CONCAT(code, '-', user_id) 
IN (SELECT CONCAT(code, '-', user_id) FROM b WHERE include != 1

非常感谢任何帮助!

【问题讨论】:

  • 左连接不起作用
  • 你需要记录表B中可用的代码
  • 你在表 B 中有多条记录,你不需要它们只需要一条记录吗?
  • 这里的左连接不起作用,因为它乘以我在表B中多次使用相同代码时返回的结果量。我只需要知道是否存在相同的记录组合代码 + user_id 和 include = 1
  • 我不明白为什么您的第一个查询不起作用...您是否尝试过使用 SELECT DISTINCT(a.code, a.user_id) 或类似的东西来删除重复项?

标签: mysql select subquery where-in


【解决方案1】:

至少有两种方法可以做到这一点

不包括左连接:

SELECT a.code, a.user_id
FROM A a 
LEFT JOIN B
  ON  a.code    = b.code 
  AND a.user_id = b.user_id
  AND b.include = 1
WHERE b.user_id IS NULL

或排除子选择

SELECT a.code, a.user_id
FROM A a
WHERE NOT EXISTS (
  SELECT 1
  FROM B b
  WHERE b.code    = a.code 
    AND b.user_id = a.user_id
    AND b.include = 1
)

http://sqlfiddle.com/#!9/e0118c/1

【讨论】:

  • 谢谢!我认为这就是我一直在寻找的,它返回的行数比我所拥有的解决方案多。您能否解释一下为什么第一个查询适用于 where b.user_id IS NULL?
  • 这是因为LEFT JOIN 的工作方式。如果对于表A 中的一行,表B 中没有满足连接条件的行,则表B 中的所有列都将包含NULL。如果将查询修改为SELECT * ... 而不使用WHERE ...,您将看到LEFT JOIN (sample) 的未过滤结果。现在您可以检查在 JOIN 条件中使用的任何 B 列。如果是 NULL - 只有在给定表 A 行中没有找到表 B 中的行时才有可能。
【解决方案2】:

试试这个

SELECT a.code, a.user_id
LEFT JOIN B ON a.code = b.code AND a.user_id = b.user_id
FROM A a WHERE b.include != 1

此解决方案等于您的第二个查询。

【讨论】:

  • 这不起作用。我得到了超过 2000 个结果,而表 A 只有 1700 条记录。
猜你喜欢
  • 1970-01-01
  • 2010-12-07
  • 2013-12-16
  • 2016-12-29
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多