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í.