Mysql 仅当存在于另一个表中时,才从表中选择值

Mysql 仅当存在于另一个表中时,才从表中选择值,mysql,Mysql,我有两张桌子 表一: ID COLOR 1 white 2 red 3 black 4 blue 5 yellow 表二: ID COLOR 1 white 2 white 3 red 4 black 输出应为: 1 white 2 red 3 black (排除第二个表中不存在的2个值-蓝色和黄色+排除第二个白色) 我尝试了不同的连接和存在查询,但没有成功。谢谢。存在的地方适用于此 select * from t1 where

我有两张桌子

表一:

ID COLOR    
1  white 
2  red 
3  black 
4  blue 
5  yellow
表二:

ID COLOR    
1  white 
2  white 
3  red 
4  black 
输出应为:

1 white
2 red
3 black
(排除第二个表中不存在的2个值-蓝色和黄色+排除第二个白色)


我尝试了不同的连接和存在查询,但没有成功。谢谢。

存在的地方
适用于此

select * 
  from t1
  where exists 
    (select 1
      from t2 where color = t1.color);

子查询是一个相关子查询(因为它引用了来自另一个查询的值),因此它对外部查询的每一行执行。因此,内部查询需要做的就是检查并查看外部查询(和第一个表)中的颜色是否存在于第二个表中

SELECT DISTINCT t1.* FROM t1 
INNER JOIN t2 ON t1.color = t2.color;

这是另一种获得与@pala_uu相同内容的方法,两个表具有相同的名称。这不是严重违反了DB基础吗?内部连接将解决您的问题。我简化了代码。第一个表包含所有类别(ID,Cat),第二个表包含分配类别(ID,Title,…Cat)。我只想(在循环中)输出那些有帖子且不是空的类别。在这个问题的上下文中,这个评论毫无意义。不管怎样,它是有效的,谢谢:)谢谢演示:)嗨,你能帮我解决这个问题吗?我想澄清一件事,我想要和这个一样的东西,我以前从来没有做过,但让我问你一个问题,比如我有3张桌子;t1,t2,t3,我在它们上面有内部连接,比如t1.id内部连接t2.id内部连接t3.id我的位置是t1.id=1和t2.id=1和t3.id=3,问题是如果任何表中只存在on,则不会返回结果。在这个问题中应该做些什么附加信息我仍然希望选择或启动查询,即使它不存在于其他表中,这意味着我将只从id存在的表中选择,就像您希望使用
左连接
而不是
内部连接
。要了解更多信息,请尝试问一个问题Where Exists is is is is very slow query我尝试时花了19秒。Left join要快得多,相比之下只花了0.85秒。我相信(如果我错了,请有人纠正我),但也更有效,因为在join上添加子句将减少要比较的记录数,而不是比较两个表中的所有记录实际上,此版本将强制使用临时表,这要归功于独特的
where-exists
版本。比较解释计划@dbinns66。不对。
存在
版本应该更高效。它没有
选择distinct
。是的,它看起来像。添加了DISTINCT以删除联接中包含的重复白色。也许是另一种方式?@gordon-我仍然相信exists会进行额外的全表扫描。。。根据定义,这是必须的