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

Изберете всички дублиращи се редове въз основа на една или две колони?

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

Проверете следния пример за критерии за избор на една колона:

Създаване на таблица:

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

Вмъкване на кортеж:

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

Резултатът, от който се нуждаете:

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)

[ОТГОВОР]

Но ако критериите ви за избор са на базата на повече от една колона, тогава можете да използвате JOIN.

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

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

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)

Така че имате само една двойка first и last наименува тези повторения (или се дублира с някои други редове).

Сега въпросът е:как да изберете id от този ред? Използвайте Join! както следва:

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)

можете да изберете на базата на толкова колони, колкото искате, напр. една колона, ако искате да използвате присъединяване, след това премахнете фамилното име.



  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 с помощта на Sum и Case

  2. Използване на MySQL тригери за регистриране на всички промени в таблицата във вторична таблица

  3. PostgreSQL GROUP BY различна от MySQL?

  4. Отпадането на таблицата кара MySQL да виси

  5. SQLAlchemy и UnicodeDecodeError