Một cách để đạt được kết quả của bạn là sử dụng truy vấn lồng nhau và có mệnh đề:Trong truy vấn bên trong, hãy chọn những người có số lượng nhiều hơn một, và trong truy vấn bên ngoài, hãy chọn id:
Kiểm tra ví dụ sau để biết tiêu chí chọn cột đơn:
Tạo bảng:
CREATE TABLE `person` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`first` varchar(120) NOT NULL,
`last` varchar(120) NOT NULL
);
Chèn tuple:
INSERT INTO `person` ( `first`, `last`) VALUES
("mukta", "chourishi"),
("mukta", "chourishi"),
("mukta", "john"),
("carl", "thomas" );
Kết quả bạn cần:
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)
[TRẢ LỜI]
Nhưng nếu bạn lựa chọn tiêu chí dựa trên nhiều hơn một cột thì bạn có thể sử dụng JOIN.
Để giải thích điều đó, tôi đang viết một truy vấn lựa chọn tạo ra một bảng trung gian sẽ được sử dụng trong JOIN làm bảng toán hạng thứ hai.
Truy vấn là chọn tất cả tên nắm tay và cột các bản trùng lặp đó với một số hàng khác:
Ví dụ:chọn các hàng trong đó first
và last
tên lặp lại
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)
Vì vậy, bạn chỉ có một cặp first
và last
đặt tên cho những phần lặp lại đó (hoặc trùng lặp với một số hàng khác).
Bây giờ, câu hỏi là:làm thế nào để chọn id
của hàng này? Sử dụng Tham gia! như sau:
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)
bạn có thể chọn trên cơ sở bao nhiêu cột tùy thích, ví dụ:cột đơn nếu bạn muốn sử dụng phép nối thì hãy xóa họ.