[英]MySQL: How to Remove One Row of a Multi-Row Record Based on Column
如果我有兩個表,我正在加入,我寫的最簡單的查詢可能是這樣的:
SELECT *
FROM t1
LEFT JOIN t2 ON t1.id = t2.id
有一些記錄每個ID有多行,因為它們有多個雇主,所以t1
看起來像這樣:
ID Name Employer
12345 Jerry Comedy Cellar
12345 Jerry NBC
12348 Elaine Pendant Publishing
12346 George Real Estate
12346 George Yankees
12346 George NBC
12347 Kramer Kramerica Industries
t2
與相似的ID相關聯,但有一些我想看的活動 - 因此上面的SELECT *
。 雖然如果Employer
專欄是“NBC”,我不想要多行返回 - 但其他一切都很好。
唯一重要的另一件事是t2
小於t1
,因為t1
是每個人而t2
只來自進行特定活動的人 - 所以有些匹配不會從t2
返回任何東西,但我仍然會喜歡它們返回,因此LEFT JOIN
。
如果我寫這樣的查詢:
SELECT *
FROM t1
LEFT JOIN t2 ON t1.id = t2.id
WHERE Employer <> "NBC"
然后它完全刪除了Jerry和George - 當我真正想要的只是NBC行不被返回,而是返回與它們相關聯的任何其他行。
如何在使用t2
加入t1
時寫入查詢以返回除NBC之外的每一行? 理想的輸出是來自t1
所有行,無論它們是否與t2
所有行匹配,除了在返回文件中刪除所有以“NBC”作為雇主的行。 基本上這里的理想是返回它們適合的JOIN,但無論如何將“NBC”作為雇主移除整行而不刪除其他行。
我寫的越多,似乎我應該在我的JOIN
之前運行一個查詢來刪除t1
中以“NBC”為雇主的所有行,然后運行普通查詢。
基本子集過濾
您可以通過擴展ON
子句來過濾兩個合並(已連接)子集中的任何一個。
SELECT *
FROM t1
LEFT JOIN t2
ON t1.ID = t2.ID
AND t2.Employer != 'NBC'
如果您現在獲得null
值,並且您不想要它們,則需要添加:
WHERE t2.Employer IS NOT NULL
擴展邏輯:
SELECT *
FROM t1
LEFT JOIN t2
ON (t1.ID = t2.ID AND t2.Employer != 'NBC')
OR (t2.ID = t2.ID AND t2.Employer IS NULL)
使用UNION
基本上, JOIN
用於水平鏈接, UNION
用於垂直鏈接數據集。
它合並到結果集:第一個沒有NBC,第二個(基本上是一個OUTER JOIN
),在t1中添加了不屬於t2的每個人。
SELECT *
FROM t1
LEFT JOIN t2
ON t1.ID = t2.ID
AND t2.Employer != 'NBC'
UNION
SELECT *
FROM t1
LEFT JOIN t2
ON t1.ID = t2.ID
AND t2.Employer IS NULL
結果集中的字符串操作
如果您只想刪除NBC
作為字符串,這是一個解決方法:
SELECT
t1.*,
IF (t2.Employer = 'NBC', NULL, t2.Employer) AS Employer
FROM t1
LEFT JOIN t2
ON t1.id = t2.id
這基本上用NULL
替換"NBC"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.