Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zaznaczyć wszystkie zduplikowane wiersze na podstawie jednej lub dwóch kolumn?

Jednym ze sposobów uzyskania wyniku jest użycie zapytania zagnieżdżonego i klauzuli:w zapytaniu wewnętrznym wybierz te, które mają więcej niż jeden, a w zapytaniu zewnętrznym wybierz id:

Sprawdź następujący przykład kryteriów wyboru pojedynczej kolumny:

Utwórz tabelę:

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

Wstaw krotkę:

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

Potrzebny wynik:

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)

[ODPOWIEDŹ]

Ale jeśli kryteria wyboru opierają się na więcej niż jednej kolumnie, możesz skorzystać z opcji JOIN.

Aby to wyjaśnić, piszę zapytanie selekcyjne, które tworzy tabelę pośrednią, która będzie używana w JOIN jako druga tabela operandów.

Zapytanie polega na zaznaczeniu wszystkich pierwszych nazw i kolumn tych duplikatów z niektórymi innymi wierszami:
Na przykład wybierz wiersze, w których first i last powtarza się nazwa

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)

Więc masz tylko jedną parę first i last nazywa te powtórzenia (lub jest duplikatami z kilkoma innymi wierszami).

Teraz pytanie brzmi:jak wybrać id z tego rzędu? Użyj Dołącz! w następujący sposób:

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)

możesz wybrać na podstawie dowolnej liczby kolumn, np. pojedyncza kolumna, jeśli chcesz użyć połączenia, a następnie usuń nazwisko.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przekonwertować ludzką datę na uniksowy znacznik czasu w Mysql?

  2. Problem z bazą danych Laravel 5

  3. Użyj klucza podstawowego wrażliwego na akcent w MySQL

  4. Sprawdź, czy wiersz istnieje, używając starego interfejsu API mysql_*

  5. Inżynieria wsteczna definicji klasy deklaratywnej SQLAlchemy z istniejącej bazy danych MySQL?