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.