繁体   English   中英

sql 只返回具有特定列值的行

[英]sql only return rows that have certain column values

在此处输入图像描述

使用上面的表格,我如何返回属于仅在type_id = 34 和 35 中且不属于type_id = 8 的公司的user_id (s)。因此,由于comp_id = 3 不在type_id = 8 中并且在type_id = 34 中和 35 因此结果应该是user_id =104 和 105

我正在寻找type_id = 34 和 35 都不是 or 的公司中的用户。 如果不是在 34 中而是在 35 中,则不应返回该公司的用户。

您可以使用条件聚合来获取满足您条件的comp_id并使用运算符IN获取user_id

select user_id 
from Table_2
where comp_id in (
  select comp_id
  from Table_1
  group by comp_id
  having sum(type_id not in (34, 35)) = 0
     and sum(type_id in (34, 35)) = 2
)

如果除了 34、35 和 8 之外还有其他type_id并且只要存在 34 和 35 但不存在 8,它们也被允许:

select user_id 
from Table_2
where comp_id in (
  select comp_id
  from Table_1
  group by comp_id
  having sum(type_id = 8) = 0
     and sum(type_id in (34, 35)) = 2
)

这是一种简单易读的方法。

SELECT DISTINCT user_id 
FROM Table_2
WHERE comp_id IN (
    SELECT DISTINCT comp_id
    FROM Table_1
    WHERE type_id IN (34, 35)
    MINUS
    SELECT DISTINCT comp_id
    FROM Table_1
    WHERE type_id IN (8)
)

如果您的数据库不支持 SELECT DISTINCT,那么只需使用 SELECT 并将 GROUP BY comp_id 添加到每个 SELECT 语句的底部。 关键字的大小写是可选的。 如果您已经有一个用于 Table_2 的大 WHERE 语句,您可以使用子选择的内部连接而不是 IN。

-- 编辑:避免对 MySQL 使用 MINUS --
忏悔:我目前无法在 MySQL 中测试这个 SQL

SELECT DISTINCT Table_2.user_id 
FROM Table_2
INNER JOIN
     (SELECT DISTINCT comp_id
      FROM Table_1
      WHERE type_id IN (34, 35)
     ) type_include ON Table_2.type_id = type_include.type_id
LEFT JOIN
     (SELECT DISTINCT comp_id
      FROM Table_1
      WHERE type_id IN (8)
     ) type_exclude ON Table_2.type_id = type_exclude.type_id
                   AND type_exclude.type_id IS NULL

你可以用一个子查询来做这样的事情,你可以在其中指定不应该满足的条件

SELECT DISTINCT t2.user_id 
    FROM Table_2 t2 
JOIN Table_1 t1 
    ON ((t1.comp_id = t2.comp_id) 
      AND ((type_id = 34) OR (type_id = 35))
      AND t1.comp_id NOT IN (SELECT comp_id FROM Table_1 WHERE type_id = 8)
    )
;

PS:对于您示例中的数据,您甚至不必检查 ID 是否等于 35 或 34,因为无论如何您的数据中都没有其他值。

SELECT DISTINCT t2.user_id 
    FROM Table_2 t2 
    WHERE t2.comp_id NOT IN (SELECT comp_id FROM Table_1 WHERE type_id = 8)
;

编辑:正如正确指出的那样,第一个查询将

  • 还包括 user_ids,其中 Table_1 仅具有type_id = 34type_id = 35的行并且不仅具有两者
  • 还包括 user_ids,其中 Table_1 具有除 34 或 35 之外的行可能具有除 8 之外的另一个type_id (示例中不存在,但可能发生在其他数据中)

这是设计使然,因为我理解需要这个的问题。 如果这不是预期的结果,请查看@forpas 的答案( https://stackoverflow.com/a/63382574/14015737 ),这会产生上述两种情况都没有的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM