Mysql 对于特定的唯一id,所有值都相同的查询

Mysql 对于特定的唯一id,所有值都相同的查询,mysql,sql,Mysql,Sql,我在下面提到了数据库: id Value 1 A 1 B 1 B 2 A 2 B 3 B 3 B 我想 这些id仅在所有与这些id相对的值都是B.i.e id 3的情况下 使用where-id=一个while查询,但它给出了所有id,其中两个值都存在。 您可以使用group by并具有: 如果您有一个单独的ID表,这可能会更快: select i.id from ids i where not exists (select 1 from idvalues iv w

我在下面提到了数据库:

id  Value
1   A
1   B
1   B
2   A
2   B
3   B
3   B
我想

这些id仅在所有与这些id相对的值都是B.i.e id 3的情况下 使用where-id=一个while查询,但它给出了所有id,其中两个值都存在。 您可以使用group by并具有:

如果您有一个单独的ID表,这可能会更快:

select i.id
from ids i
where not exists (select 1 from idvalues iv where iv.id = i.id and iv.value <> 'B') and
      exists (select 1 from idvalues iv where iv.id = i.id and iv.value = 'B');  -- at least one B
这可以利用idvaluesid、value上的索引。

您可以使用group by并具有:

如果您有一个单独的ID表,这可能会更快:

select i.id
from ids i
where not exists (select 1 from idvalues iv where iv.id = i.id and iv.value <> 'B') and
      exists (select 1 from idvalues iv where iv.id = i.id and iv.value = 'B');  -- at least one B

这可以利用idvaluesid,value上的索引。

第一个查询还应该使用idvaluesid,value上的索引。事实上,第一个查询可以将其用作覆盖索引。@RaymondNijland。这当然是真的。让MySQL使用索引进行聚合对我来说似乎真的很麻烦——除非最新版本使这一点变得更简单。第一个查询还应该使用idvaluesid,value上的索引。事实上,第一个查询可以将其用作覆盖索引。@RaymondNijland。这当然是真的。让MySQL使用索引进行聚合对我来说似乎真的很麻烦——除非最新的版本使这变得更简单。