Chọn nơi số lượng của một trường lớn hơn một


100

Tôi muốn làm một cái gì đó như thế này:

SELECT * 
  FROM db.table 
 WHERE COUNT(someField) > 1

Làm cách nào để đạt được điều này trong MySql?

Câu trả lời:


146

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 HAVINGmệ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à ...


11
Cần một cái GROUP BYchắc chắn (trừ khi đây là một số điều không chuẩn của MySQL)?
Martin Smith

@Martin Smith: Thực hiện truy vấn theo mệnh giá; đã giải quyết vấn đề GROUP BY (bao gồm tính năng cột ẩn).
OMG Ponies

"Có vẻ như nó phải là ..." Tại sao? Tôi cần được giáo dục về điều này :)
Dave

Vì vậy, điều này sẽ trả về toàn bộ bảng nếu nó chứa nhiều hơn 2 giá someFieldtrị không null hoặc một tập hợp kết quả trống nếu không.
Martin Smith

@Dave: Nếu bạn ở vị trí phải định kỳ kiểm tra & sửa dữ liệu xấu, bạn có muốn ngăn chặn tình trạng này xảy ra ngay từ đầu không? Dụng cụ MySQL một hạn chế duy nhất là một chỉ số - để biết thêm thấy CREATE INDEX tài liệu
OMG Ngựa Non

18
SELECT username, numb from(
Select username, count(username) as numb from customers GROUP BY username ) as my_table
WHERE numb > 3

3
cảnh báo duy nhất ở đây (ít nhất là trong 5.1.46-community MySQL Community Server (GPL)) là "Mọi bảng dẫn xuất phải có bí danh riêng", điều đó sẽ làm cho bạn sql giống như: CHỌN tên người dùng, tê liệt từ (Chọn tên người dùng, đếm (tên người dùng) là vô hiệu từ khách hàng GROUP BY tên người dùng) là my_table WHERE tê liệt> 3
D_K

14

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

11

Của bạn đây:

SELECT Field1, COUNT(Field1)
  FROM Table1 
 GROUP BY Field1
HAVING COUNT(Field1) > 1
ORDER BY Field1 desc

4

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)

1

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 đó.


1
Không hoàn toàn đúng - sử dụng GROUP BY để thao túng những gì HAVING đang sử dụng.
OMG Ponies

1

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



1

Đố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


-2

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.


3
Đây không thực sự là một câu trả lời.
anon582847382 Ngày
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.