MySQL使用 "only if"条件选择行

标签 mysql sql database

我正在尝试编写一个查询来选择行,以便严格满足条件。我认为展示我正在尝试做的事情的最好方法是用一个例子。

假设我有下表

+------------+
| A_Table    |
+----+-------+
| id | value |
+----+-------+
|  1 |     1 |
|  2 |     1 |
|  2 |     2 |
|  3 |     1 |
|  3 |     2 |
|  3 |     5 |
+----+-------+

我想要的是一个返回仅与给定值匹配的 id 的查询。例如,假设我想要 id 的值严格在 (1,2) 内,则 id=2 是唯一满足此要求的。尽管 id=3 具有值 1 和 2,但它并不严格只有这些值(以及 id=1)。

这是我提出的查询

select id
from A_Table a
where value in (1,2)
and not exists (
  select b.id 
  from A_Table b
  where value not in (1,2)
  and b.id = a.id
);

但是这会返回 1 和 2,因为 in 运算符只满足 id 1 的值 1。我不确定如何强制执行“严格”部分。

最佳答案

我会使用聚合来做到这一点:

select a.id
from a_table a
group by a.id
having sum(a.value = 1) > 0 and         -- id has value = 1
       sum(a.value = 2) > 0 and         -- id has value = 2
       sum(a.value not in (1, 2)) = 0;  -- id has nothing else

关于MySQL使用 "only if"条件选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41129237/

相关文章:

Python MySql Connector 准备语句和字典类

java - 如何从 Java 调用 MySQL 存储函数?

bash脚本中的Mysql密码警告

c# - 访问不同的数据源

php - SQLSTATE[HY000] [1040] 连接太多

PHP 如何使用 MYSQL 检索存储在文档根目录之外的图像?

用于优先匹配模式/文本的 MySQL 逻辑

javascript - (JavaScript) 如何检查 JSON 中的 key

sql - 迷你数据库 - 子查询返回超过 1 个值

database - 试图删除 (*) 和 (*) 之间的关系。但是,关系的外键之一 (X) 不能设置为 null