Navicat 部落格

選取只有一個值的列 2020 年 7 月 6 日,由 Robert Gravelle 撰寫

在資料庫開發和管理中,取得具只有一個特定值的列是相當常見的任務。這聽起好像很簡單,但是將結果限制在那些只具有一個值而不能將其他值排除在外的列比聽起來更棘手。原因是,雖然使用 != 不等於或 NOT IN 比較運算子來篩選值是很簡單,但是它們僅隱藏不符合的值,而不是告訴我們實際是否擁有其他值。好消息是,有一種簡單的方法可以做到這一點。請繼續閱讀,了解如何做到!

按角色選取使用者

所有資料庫以及大多數應用程式都有使用者。特別是,資料庫使用者傾向於擁有不同的角色。(儘管應用程式使用者也可以有角色。)以下是 Navicat 的資料表設計器中此類資料表的例子:

user_roles_table_design (92K)

在這個例子,role_id 是一個外部索引鍵(FK),它連結至一個角色資料表,該資料表儲存有關每個角色的其他資訊。在使用者資料表中包含 role_id,這樣每個使用者可能有多列。請記住這一點,因為我們稍後會再次討論。

user_roles_table (37K)

列出只有一個角色的使用者的錯誤方法

如果現在要列出擁有僅具一個特定使用者角色的使用者,我們可能要撰寫類似以下的內容:

role_id_equal_to_1 (33K)

問題在於上述查詢僅列出了 role_id 為 1 的使用者。它並讓我們知道他們是否也具有其他 role_id。此外,加入其他條件(例如 AND role_id NOT IN (2,3,4,5,6,7,8,9))無濟於事,因為 1 顯然不是任何其他數字!

那麼,如何將使用者限制為只有 role_id 為 1 且沒有其他角色??

列出只有一個角色的使用者的正確方法

從技術上講這不是「正確的方法」,因為肯定還有其他方法。該解決方案包括計算每個使用者的列數。這個想法是,如果一個使用者擁有我們感興趣的 role_id 並且資料表中只有一列,那麼他們就是我們想要看到的結果。

我們可以使用 GROUP BY 計算資料表中每個用者的 user_id 數量。然後,HAVING 子句可以檢查使用者是否只有一列,以及他或她的一個 role_id 是否我們想要的:

final_query (31K)

現在,我們只看到一個 role_id 為 1 的使用者,而他並沒有其他 role_id!

總結

這種方法的優點在於,可以輕鬆地修改查詢以尋找資料表中包含多個值的列或超過一定列數的列。

如果你對 Navicat Premium 感興趣,可以免費試用 14 天!

Navicat 文章
頻道記錄
分享
部落格封存檔