Mysql
 sql >> база данни >  >> RDS >> Mysql

4 начина за намиране на дублиращи се редове в MySQL

Ако смятате, че MySQL таблица може да има дублиращи се редове, можете да използвате следните опции, за да върнете всички дублирани.

Примерни данни

Да предположим, че имаме таблица със следните данни:

ИЗБЕРЕТЕ * ОТ домашни любимци; 

Резултат:

<пред>+-------+--------+--------+| PetId | Име на домашни любимци | PetType |+-------+--------+--------+| 1 | Размахване | Куче || 1 | Размахване | Куче || 2 | Надраскване | Котка || 3 | Tweet | Птица || 4 | Кора | Куче || 4 | Кора | Куче || 4 | Кора | Куче |+-------+--------+--------+

Първите два реда са дублирани, както и последните три реда. Дублиращите се редове споделят едни и същи стойности във всички колони.

Опция 1

Една от опциите е да използвате следната заявка за връщане на дублиращи се редове:

ИЗБЕРЕТЕ DISTINCT PetId, COUNT(*) КАТО "Брой" ОТ PetsGROUP BY PetIdORDER BY PetId; 

Резултат:

+-------+-------+| PetId | Брой |+-------+-------+| 1 | 2 || 2 | 1 || 3 | 1 || 4 | 3 |+-------+-------+

Можем да разширим SELECT списък, за да включите още колони, ако е необходимо:

ИЗБЕРЕТЕ PetId, PetName, PetType, COUNT(*) КАТО "Брой" ОТ PetsGROUP ПО PetId, PetName, PetTypeORDER BY PetId; 

Резултат:

+-------+--------+--------+-------+| PetId | Име на домашни любимци | PetType | Брой |+-------+--------+--------+-------+| 1 | Размахване | Куче | 2 || 2 | Надраскване | Котка | 1 || 3 | Tweet | Птица | 1 || 4 | Кора | Куче | 3 |+-------+--------+-------+-------+

Можем да накараме дубликатите да се показват първи, като ги подредим по брой в низходящ ред:

ИЗБЕРЕТЕ PetId, PetName, PetType, COUNT(*) КАТО "Брой" ОТ PetsGROUP ПО PetId, PetName, PetTypeORDER BY Count DESC; 

Резултат:

+-------+--------+--------+-------+| PetId | Име на домашни любимци | PetType | Брой |+-------+--------+--------+-------+| 4 | Кора | Куче | 3 || 1 | Размахване | Куче | 2 || 2 | Надраскване | Котка | 1 || 3 | Tweet | Птица | 1 |+-------+--------+--------+-------+

Опция 2

Ако искаме да изброим само дублиращите се редове, можем да използваме HAVING клауза за изключване на недублирани от изхода:

ИЗБЕРЕТЕ PetId, PetName, PetType, COUNT(*) КАТО "Брой" ОТ PetsGROUP ПО PetId, PetName, PetTypeHAVING COUNT(*)> 1 ORDER BY PetId; 

Резултат:

+-------+--------+--------+-------+| PetId | Име на домашни любимци | PetType | Брой |+-------+--------+--------+-------+| 1 | Размахване | Куче | 2 || 4 | Кора | Куче | 3 |+-------+--------+-------+-------+

Опция 3

Друг начин да го направите е да използвате ROW_NUMBER() функция с PARTITION BY клауза за номериране на изхода на резултатния набор.

SELECT *, ROW_NUMBER() НАД ( РАЗДЕЛЯНЕ ПО PetId, PetName, PetType ORDER BY PetId, PetName, PetType ) КАТО rnFROM Pets; 

Резултат:

+-------+--------+--------+----+| PetId | Име на домашни любимци | PetType | rn |+-------+--------+--------+----+| 1 | Размахване | Куче | 1 || 1 | Размахване | Куче | 2 || 2 | Надраскване | Котка | 1 || 3 | Tweet | Птица | 1 || 4 | Кора | Куче | 1 || 4 | Кора | Куче | 2 || 4 | Кора | Куче | 3 |+-------+--------+-------+----+

РАЗДЕЛЯНЕ ПО клаузата разделя резултатния набор, произведен от FROM клауза в дялове, към които се прилага функцията. Когато посочим дялове за резултатния набор, всеки дял кара номерирането да започне отново (т.е. номерирането ще започне от 1 за първия ред във всеки дял).

Опция 4

За да върнем само излишните редове от съвпадащите дубликати, можем да използваме горната заявка като общ табличен израз, както следва:

С cte КАТО ( SELECT *, ROW_NUMBER() НАД ( PARTITION BY PetId, PetName, PetType ORDER BY PetId, PetName, PetType ) КАТО rn ОТ домашни любимци )SELECT * FROM cte КЪДЕ rn <> 1; 

Резултат:

+-------+--------+--------+----+| PetId | Име на домашни любимци | PetType | rn |+-------+--------+--------+----+| 1 | Размахване | Куче | 2 || 4 | Кора | Куче | 2 || 4 | Кора | Куче | 3 |+-------+--------+-------+----+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:Как да получите дължината на текста в колона

  2. MySQL управление на потребителите

  3. Как да получите няколко броя с една SQL заявка?

  4. Как да получите данни за текущата седмица в MySQL

  5. SQL заявка за изтриване на база данни в MySQL