簡體   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