![](/img/trans.png)
[英]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.