Ett sätt att uppnå ditt resultat är att använda kapslad fråga och ha-sats:I den inre frågan välj de som räknar mer än en, och i den yttre frågan välj id:
Kontrollera följande exempel för urvalskriterier för en kolumn:
Skapa tabell:
CREATE TABLE `person` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`first` varchar(120) NOT NULL,
`last` varchar(120) NOT NULL
);
Infoga tupel:
INSERT INTO `person` ( `first`, `last`) VALUES
("mukta", "chourishi"),
("mukta", "chourishi"),
("mukta", "john"),
("carl", "thomas" );
Resultatet du behöver:
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)
[SVAR]
Men som om dina urvalskriterier baseras på mer än en kolumn så kan du använda JOIN.
För att förklara det skriver jag en urvalsfråga som skapar en mellantabell som kommer att användas i JOIN som andra operandtabell.
Frågan är markera alla första namn och kolumn dessa dubbletter med några av andra rader:
Välj till exempel rader där first
och last
namnet upprepas
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)
Så du har bara ett par first
och last
namnger dessa upprepningar (eller är dubbletter med några andra rader).
Nu är frågan:hur man väljer id
av den här raden? Använd Gå med! enligt följande:
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)
du kan välja utifrån hur många kolumner du vill t.ex. enda kolumn om du vill använda join, ta bort efternamn.