看起來像你想在城市name
列「匹配」。
首先編寫一條SELECT語句,然後在將其轉換爲DELETE語句之前對其進行測試。
SELECT d.*
FROM table d
JOIN table k
ON k.name = d.name
AND k.population > d.population
AND k.id <> d.id
我們要保持從k
的行,並從d
刪除行。
通過用DELETE替換SELECT關鍵字,將其轉換爲DELETE語句。
請注意,如果城市中存在多個具有相同「最高」人口的行,則此查詢不會識別這些行。爲了擺脫具有相同人口價值的「重複」,我們需要一個稍微不同的方法。
我會使用反連接:
SELECT d.*
FROM table d
LEFT
JOIN (SELECT MIN(r.id) AS min_id
FROM (SELECT t.name
, MAX(t.population) AS max_pop
FROM table t
GROUP BY t.name
) s
JOIN table r
ON r.name = s.name
AND r.population = s.max_pop
GROUP BY r.name
) q
ON q.min_id = d.id
WHERE q.min_id IS NULL
內嵌視圖q
應該返回id
值的列表,從我們要保持的行。任何不在該列表中的id
行都是我們想要刪除的行。
如果MySQL在內聯視圖中引用表引用,我們可以將其換行爲另一個內聯視圖作爲解決方法。
SELECT d.*
FROM table d
LEFT
JOIN (SELECT q.min_id
FROM (SELECT MIN(r.id) AS min_id
FROM (SELECT t.name
, MAX(t.population) AS max_pop
FROM table t
GROUP BY t.name
) s
JOIN table r
ON r.name = s.name
AND r.population = s.max_pop
GROUP BY r.name
) q
) p
ON p.min_id = d.id
WHERE p.min_id IS NULL
通過用DELETE關鍵字替換最外面的SELECT關鍵字,將其轉換爲DELETE語句。
如果你有最多的人口數相同的名字,那麼你就需要讓他們全部或只有一個? –
我想在這種情況下只保留一行(不關心所選行) –