MySQL去重複保留一條操作

一、查詢不重複數據

MySQL有distinct、group by和having等實現查詢不重複數據的方法,但實際上它們的實現機制並不完全一致,需根據實際場景選擇最優解。

1. Distinct方法

SELECT DISTINCT column FROM table;

該方法適用於篩選單個欄位不重複數據的場景,例如:

SELECT DISTINCT name FROM students;

這將返回去重後所有不同的名字。

2. Group By方法

SELECT column1, column2, ... FROM table GROUP BY column1, column2, ...;

該方法適用於篩選多個欄位不重複數據的場景,例如:

SELECT name, age FROM students GROUP BY name, age;

這將返回去重後所有不同的姓名和對應年齡。

3. Having方法

SELECT column1, column2, ... FROM table GROUP BY column1, column2, ... HAVING condition;

該方法適用於篩選多個欄位不重複數據並需要指定條件的場景,例如:

SELECT name, age FROM students GROUP BY name, age HAVING COUNT(*) > 1;

這將返回去重後所有重複的姓名和對應年齡。

二、刪除重複數據

MySQL可以使用三種方法實現刪除重複數據:去重查詢+臨時表、子查詢和自聯接。

1. 去重查詢+臨時表

首先使用去重查詢構建一個臨時表,再根據臨時表的唯一鍵刪除重複行:

CREATE TABLE temp_table SELECT DISTINCT * FROM table;
ALTER TABLE temp_table ADD UNIQUE INDEX unique_index (column1, column2, ...);
DELETE t1 FROM table t1, temp_table t2 WHERE t1.column1=t2.column1 AND t1.column2=t2.column2 ...;

2. 子查詢

使用子查詢篩選出重複行的主鍵值,再根據主鍵值刪除重複行:

DELETE FROM table WHERE id IN (SELECT id FROM (SELECT id, column1, column2, ... FROM table GROUP BY column1, column2, ... HAVING COUNT(*) > 1) as temp_table);

3. 自聯接

使用自聯接查找重複數據的主鍵值,並根據主鍵值刪除重複行:

DELETE t1 FROM table t1, table t2 WHERE t1.id > t2.id AND t1.column1=t2.column1 AND t1.column2=t2.column2 ...;

三、保留一條重複數據

MySQL中可以使用多種方法保留一條重複數據:使用子查詢、臨時表、內聯接等,具體需根據數據特徵和查詢效率選取。

1. 子查詢

使用子查詢篩選出重複行中的最小/最大ID值,並將其餘ID值刪除:

DELETE FROM table WHERE id NOT IN (SELECT MIN(id) FROM table GROUP BY column1, column2 ...);

2. 臨時表

使用臨時表構建一份保留一條數據的副本,並將其餘數據刪除:

CREATE TABLE temp_table SELECT MIN(id) as id, column1, column2, ... FROM table GROUP BY column1, column2 ...;
DELETE t1 FROM table t1 LEFT JOIN temp_table on t1.id=temp_table.id WHERE temp_table.id IS NULL;

3. 內聯接

使用內聯接查詢保留一條數據:

DELETE t1 FROM table t1 INNER JOIN table t2 ON t1.column1=t2.column1 AND t1.column2=t2.column2 ... WHERE t1.id > t2.id;

四、小結

MySQL去重複保留一條數據,常用的方法有查詢不重複數據、刪除重複數據和保留一條重複數據三種,每種方法有多種實現方式,需根據具體場景選取最優解。

原創文章,作者:JDDR,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/136575.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
JDDR的頭像JDDR
上一篇 2024-10-04 00:16
下一篇 2024-10-04 00:16

相關推薦

  • 如何修改mysql的埠號

    本文將介紹如何修改mysql的埠號,方便開發者根據實際需求配置對應埠號。 一、為什麼需要修改mysql埠號 默認情況下,mysql使用的埠號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Python棧操作用法介紹

    如果你是一位Python開發工程師,那麼你必須掌握Python中的棧操作。在Python中,棧是一個容器,提供後進先出(LIFO)的原則。這篇文章將通過多個方面詳細地闡述Pytho…

    編程 2025-04-29
  • Python操作數組

    本文將從多個方面詳細介紹如何使用Python操作5個數組成的列表。 一、數組的定義 數組是一種用於存儲相同類型數據的數據結構。Python中的數組是通過列表來實現的,列表中可以存放…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL資料庫 在使用Python操作MySQL之前,我們需要先連接MySQL資料庫。在Python中,我…

    編程 2025-04-29
  • Python磁碟操作全方位解析

    本篇文章將從多個方面對Python磁碟操作進行詳細闡述,包括文件讀寫、文件夾創建、刪除、文件搜索與遍歷、文件重命名、移動、複製、文件許可權修改等常用操作。 一、文件讀寫操作 文件讀寫…

    編程 2025-04-29
  • Python代碼實現迴文數最少操作次數

    本文將介紹如何使用Python解決一道經典的迴文數問題:給定一個數n,按照一定規則對它進行若干次操作,使得n成為迴文數,求最少的操作次數。 一、問題分析 首先,我們需要了解迴文數的…

    編程 2025-04-29
  • Python元祖操作用法介紹

    本文將從多個方面對Python元祖的操作進行詳細闡述。包括:元祖定義及初始化、元祖遍歷、元祖切片、元祖合併及比較、元祖解包等內容。 一、元祖定義及初始化 元祖在Python中屬於序…

    編程 2025-04-29
  • MySQL遞歸函數的用法

    本文將從多個方面對MySQL遞歸函數的用法做詳細的闡述,包括函數的定義、使用方法、示例及注意事項。 一、遞歸函數的定義 遞歸函數是指在函數內部調用自身的函數。MySQL提供了CRE…

    編程 2025-04-29
  • 如何用Python對數據進行離散化操作

    數據離散化是指將連續的數據轉化為離散的數據,一般是用於數據挖掘和數據分析中,可以幫助我們更好的理解數據,從而更好地進行決策和分析。Python作為一種高效的編程語言,在數據處理和分…

    編程 2025-04-29
  • Python列表的讀寫操作

    本文將針對Python列表的讀取與寫入操作進行詳細的闡述,包括列表的基本操作、列表的增刪改查、列表切片、列表排序、列表反轉、列表拼接、列表複製等操作。 一、列表的基本操作 列表是P…

    編程 2025-04-29

發表回復

登錄後才能評論