Mysql
 sql >> Database >  >> RDS >> Mysql

Seleziona tutte le righe duplicate in base a una o due colonne?

Un modo per ottenere il risultato è utilizzare la query nidificata e la clausola con:nella query interna seleziona quelli che ne contano più di uno e nella query esterna seleziona id:

Controllare il seguente esempio per i criteri di selezione di una singola colonna:

Crea tabella:

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

Inserisci tupla:

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

Il risultato che ti serve:

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)

[RISPOSTA]

Ma come se i criteri di selezione si basassero su più colonne, puoi utilizzare JOIN.

Per spiegarlo sto scrivendo una query di selezione che crea una tabella intermedia che verrà utilizzata in JOIN come seconda tabella degli operandi.

La query è selezionare tutti i nomi e colonna quei duplicati con alcune delle altre righe:
Ad esempio selezionare le righe in cui first e last il nome si ripete

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)

Quindi hai solo un paio di first e last denomina quelle ripetizioni (o è duplicato con alcune altre righe).

Ora, la domanda è:come selezionare id di questa riga? Usa Unisciti! come segue:

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)

puoi selezionare in base a quante colonne vuoi ad es. colonna singola se vuoi usare unisciti, quindi rimuovi il cognome.