sql >> Databáze >  >> RDS >> Mysql

Vybrat všechny duplicitní řádky na základě jednoho nebo dvou sloupců?

Jedním ze způsobů, jak dosáhnout svého výsledku, je použít vnořený dotaz a mít klauzuli:Ve vnitřním dotazu vyberte ty, které mají počet více než jeden, a ve vnějším dotazu vyberte id:

Kritéria výběru jednoho sloupce naleznete v následujícím příkladu:

Vytvořit tabulku:

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

Vložit n-tici:

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

Výsledek, který potřebujete:

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)

[ODPOVĚĎ]

Ale jako byste výběrová kritéria byla založena na více než jednom sloupci, můžete použít JOIN.

Abych to vysvětlil, píšu výběrový dotaz, který vytvoří přechodnou tabulku, která bude použita v JOIN jako druhá tabulka operandů.

Dotaz je vybrat všechna první jména a sloupec těchto duplikátů s některými dalšími řádky:
Například vyberte řádky, ve kterých jsou first a last jméno se opakuje

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)

Máte tedy pouze jeden pár first a last pojmenovává tato opakování (nebo je duplicitní s některými jinými řádky).

Nyní otázka zní:jak vybrat id z této řady? Použijte Připojit! následovně:

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)

můžete si vybrat na základě tolika sloupců, kolik chcete, např. jeden sloupec, pokud chcete použít join, pak odeberte příjmení.



  1. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Selhání komunikačního spojení

  2. Ruby on Rails - nelze načíst takový soubor -- mysql2/2.2/mysql2 (LoadError)

  3. Nelze nainstalovat PostgreSQL:Při spouštění runtime instalačního programu Microsoft VC++ v systému Windows XP došlo k chybě

  4. Uložené procedury MySQL je používají nebo nepoužívají