Mysql SQL逻辑不等于

Mysql SQL逻辑不等于,mysql,sql,unique,Mysql,Sql,Unique,我知道这是一个逻辑问题,但我对SQL相当陌生,不知道如何解决这个问题: 我有两张桌子 表A有一个独特的ID 表B用于存储与表A中任何行相关的数据位 表B可能有多行引用表a的一行 如何在表B中搜索所有A的ID,其中一行B不等于某个值 SELECT DISTINCT table_a_id FROM table_b b WHERE b.meta_key != 'hidden' 由于table\u a\u id是不明确的,只要table\u id在table B中的唯一一行不是隐藏的,就会返回tabl

我知道这是一个逻辑问题,但我对SQL相当陌生,不知道如何解决这个问题:

我有两张桌子

表A
有一个独特的
ID

表B
用于存储与
表A
中任何行相关的数据位

表B
可能有多行引用表a的一行

如何在
表B
中搜索所有A的
ID
,其中一行
B
不等于某个值

SELECT DISTINCT table_a_id FROM table_b b WHERE b.meta_key != 'hidden'
由于
table\u a\u id
是不明确的,只要
table\u id
table B
中的唯一一行不是
隐藏的
,就会返回
table\u id
。显然,如果我在查找每个隐藏的
表a\u id
(如果我使用=而不是!=),它是有效的,但是我如何实现相反的效果呢


感谢一种方法是使用
group by
having
子句:

SELECT table_a_id
FROM table_b b 
GROUP BY table_a_id
HAVING SUM(b.meta_key = 'hidden') = 0;
另一种方法是使用
不存在

select a.id
from table_a a
where not exists (select 1
                  from table_b b
                  where a.id = b.table_a_id and b.meta_key = 'hidden'
                 );

这个版本实际上有一个优点,即它将显示
表a
中的所有行,即使
表b
中没有行。第一个版本将只显示在
表b中有一些数据的ID,而不是
的“隐藏”值。

谢谢!后者效果最好;我最初询问的查询是表a上一个较大查询的一部分,因此后者确实简化了整个过程——只需在末尾添加一些AND子句即可获得所需的内容。