Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Selecionar todas as linhas duplicadas com base em uma ou duas colunas?


Uma maneira de obter seu resultado é usando a consulta aninhada e a cláusula havendo:Na consulta interna, selecione aqueles que contam mais de um e, na consulta externa, selecione o id:

Verifique o exemplo a seguir para critérios de seleção de coluna única:

Criar a tabela:
CREATE TABLE `person` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `first` varchar(120) NOT NULL,
    `last` varchar(120) NOT NULL
);

Inserir tupla:
INSERT INTO `person` ( `first`, `last`) VALUES
("mukta", "chourishi"),
("mukta", "chourishi"),
("mukta", "john"),
("carl", "thomas" );

O resultado que você precisa:
mysql> SELECT  `id` 
    -> FROM `person` 
    -> WHERE `first`=(SELECT `first` FROM `person` HAVING COUNT(`first`) > 1);
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
+----+
3 rows in set (0.00 sec)

[RESPOSTA]

Mas como se seus critérios de seleção fossem baseados em mais de uma coluna, então você pode usar JOIN.

Para explicar estou escrevendo uma consulta de seleção que cria uma tabela intermediária que será usada no JOIN como segunda tabela de operandos.

A consulta é selecionar todos os primeiros nomes e colunas das duplicatas com algumas das outras linhas:
Por exemplo, selecione as linhas nas quais first e last o nome se repete
mysql> SELECT `first`, `last`,  count(*)  as rows 
    -> FROM `person` 
    -> GROUP BY `first`, `last` 
    -> HAVING count(rows) > 1;
+-------+-----------+------+
| first | last      | rows |
+-------+-----------+------+
| mukta | chourishi |    2 |
+-------+-----------+------+
1 row in set (0.00 sec)

Então você tem apenas um par de first e last nomeia essas repetições (ou é duplicado com algumas outras linhas).

Agora, a questão é:como selecionar id desta fila? Use Junte-se! do seguinte modo:
mysql> SELECT  p1.`id`
    -> FROM `person` as p1
    -> INNER JOIN (
    ->     SELECT `first`, `last`,  count(*)  as rows
    ->     FROM `person` 
    ->     GROUP BY `first`, `last` 
    ->     HAVING count(rows) > 1) as p
    -> WHERE p.`first` = p1.`first` and p.`last` = p1.`last`;  
+----+
| id |
+----+
|  1 |
|  2 |
+----+
2 rows in set (0.06 sec)

você pode selecionar com base em quantas colunas desejar, por exemplo. coluna única, se você quiser usar join, remova o sobrenome.