一体,实现你的结果的方法是使用嵌套查询和having子句:在内部查询选择那些具有更个性化,然后之一,并在外部查询选择ID:
检查下面的示例单个列的选择标准:
创建表:
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)
[ANSWER]
但是,如果您的选择标准是基于多个列,那么您可以使用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
这一行?使用加入!如下所示:
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)
您可以根据需要选择任意数量的列,例如,单列如果你想使用连接然后删除姓。
阅读更新后的答案。 –