Câu trả lời:
Sử dụng mệnh đề HAVING
, không phải WHERE
, để so sánh kết quả tổng hợp.
Thực hiện truy vấn theo mệnh giá:
SELECT *
FROM db.table
HAVING COUNT(someField) > 1
Lý tưởng nhất là nên có một GROUP BY
định nghĩa để định giá thích hợp trong HAVING
mệnh đề, nhưng MySQL cho phép các cột ẩn khỏi GROUP BY ...
Điều này là để chuẩn bị cho một ràng buộc duy nhất trên someField
? Có vẻ như nó phải là ...
someField
trị không null hoặc một tập hợp kết quả trống nếu không.
SELECT username, numb from(
Select username, count(username) as numb from customers GROUP BY username ) as my_table
WHERE numb > 3
Bạn cũng có thể làm điều này bằng cách tự tham gia:
SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk
Của bạn đây:
SELECT Field1, COUNT(Field1)
FROM Table1
GROUP BY Field1
HAVING COUNT(Field1) > 1
ORDER BY Field1 desc
Một chiều
SELECT t1.*
FROM db.table t1
WHERE exists
(SELECT *
FROM db.table t2
where t1.pk != t2.pk
and t1.someField = t2.someField)
Như OMG Ponies đã nói, mệnh đề có là điều bạn muốn. Tuy nhiên, nếu bạn hy vọng rằng bạn sẽ nhận được các hàng rời rạc thay vì một bản tóm tắt ("có" tạo ra một bản tóm tắt) - thì không thể thực hiện được trong một câu lệnh. Bạn phải sử dụng hai câu lệnh trong trường hợp đó.
Tôi đưa ra một ví dụ về Group By giữa hai bảng trong Sql:
Select cn.name,ct.name,count(ct.id) totalcity
from city ct left join country cn on ct.countryid = cn.id
Group By cn.name,ct.name
Having totalcity > 2
Đối với tôi, Không có nhóm chỉ trả về kết quả trống. Vì vậy, tôi đoán việc có một nhóm bởi vì tuyên bố có là khá quan trọng
Nó cũng nên được đề cập rằng "pk" phải là một trường quan trọng. Sự tự tham gia
SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk
của Bill Karwin cung cấp cho bạn tất cả các bản ghi trùng lặp, đó là những gì tôi muốn. Vì một số có nhiều hơn hai, bạn có thể nhận được cùng một bản ghi nhiều lần. Tôi đã viết tất cả vào một bảng khác có các trường giống nhau để loại bỏ các bản ghi giống nhau bằng cách triệt tiêu các trường khóa. Tôi đã thử
SELECT * FROM db.table HAVING COUNT(someField) > 1
ở trên đầu tiên. Dữ liệu trả về từ nó chỉ cung cấp một trong số các bản sao, ít hơn 1/2 so với những gì điều này mang lại cho bạn nhưng số lượng là tốt nếu đó là tất cả những gì bạn muốn.
GROUP BY
chắc chắn (trừ khi đây là một số điều không chuẩn của MySQL)?