[英]SQL query to only return the rows that have the highest value in a certain column
[英]sql only return rows that have certain column values
您可以使用条件聚合来获取满足您条件的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)
;
编辑:正如正确指出的那样,第一个查询将
type_id = 34
或type_id = 35
的行,并且不仅具有两者type_id
(示例中不存在,但可能发生在其他数据中)这是设计使然,因为我理解需要这个的问题。 如果这不是预期的结果,请查看@forpas 的答案( https://stackoverflow.com/a/63382574/14015737 ),这会产生上述两种情况都没有的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.