MySQL - Sử dụng COUNT (*) trong mệnh đề WHERE


157

Tôi đang cố gắng thực hiện những điều sau trong MySQL (xem pseudomã)

SELECT DISTINCT gid
FROM `gd`
WHERE COUNT(*) > 10
ORDER BY lastupdated DESC

Có cách nào để làm điều này mà không sử dụng (CHỌN ...) trong mệnh đề WHERE bởi vì điều đó có vẻ như là một sự lãng phí tài nguyên.

Câu trả lời:


264

thử cái này;

select gid
from `gd`
group by gid 
having count(*) > 10
order by lastupdated desc

37
+1 để có Đây luôn là điều khoản mà họ không làm phiền để dạy đúng cách về các khóa học hoặc sách sql và biết về nó nói chung là dấu hiệu cho thấy người viết mã đã tiến bộ vượt quá trình độ mới làm quen.
Cruachan

Điều gì xảy ra nếu bạn đang cố gắng sử dụng hàm COUNT () như một phần của biểu thức boolean OR? ví dụAND ((stock = 1 OR quantity > 0) OR (COUNT(v.id) > 0)
nnyby

Tôi đã tìm ra nó .. bạn có thể thêm vào mệnh đề HAVING như vậy:HAVING variations > 0 OR (stock = 1 OR quantity > 0)
nnyby

28

Tôi không chắc chắn về những gì bạn đang cố gắng làm ... có thể một cái gì đó như

SELECT gid, COUNT(*) AS num FROM gd GROUP BY gid HAVING num > 10 ORDER BY lastupdated DESC

1
MSSQL đưa ra lỗi phân tích "tên cột không hợp lệ" cho num. Dù sao +1 cho cú pháp sạch (có thể là thiết lập của tôi hoặc ms ... ahh tốt).
samis

Cung cấp một bí danh cho tất cả các cột trong phần chọn.
Adil Khalil

17
SELECT COUNT(*)
FROM `gd`
GROUP BY gid
HAVING COUNT(gid) > 10
ORDER BY lastupdated DESC;

EDIT (nếu bạn chỉ muốn các gids):

SELECT MIN(gid)
FROM `gd`
GROUP BY gid
HAVING COUNT(gid) > 10
ORDER BY lastupdated DESC

Cảm ơn Joe nhưng điều đó trả về COUNT () - Tôi đang tìm cách trả lại tất cả các gid có thêm COUNT (*) sau đó 10

1
Không cần Min () trong đó.
Ali Ersöz

14

thử

SELECT DISTINCT gid
FROM `gd`
group by gid
having count(*) > 10
ORDER BY max(lastupdated) DESC

14

Chỉ là phiên bản học thuật mà không có điều khoản:

select *
from (
   select gid, count(*) as tmpcount from gd group by gid
) as tmp
where tmpcount > 10;

13

Không thể có các hàm tổng hợp (Ví dụ: COUNT, MAX, v.v.) trong mệnh đề WHERE. Do đó, chúng tôi sử dụng mệnh đề HAVING thay thế. Do đó, toàn bộ truy vấn sẽ tương tự như sau:

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value;

6

- tìm kiếm các trạm thời tiết bị mất hồ sơ nửa giờ

SELECT stationid
FROM weather_data 
WHERE  `Timestamp` LIKE '2011-11-15 %'  AND 
stationid IN (SELECT `ID` FROM `weather_stations`)
GROUP BY stationid 
HAVING COUNT(*) != 48;

- biến thể của yapiskan với một nơi .. trong .. chọn


1

Tôi nghĩ rằng bạn không thể thêm count()với where. bây giờ hãy xem tại sao ....

wherekhông giống như having, havingcó nghĩa là bạn đang làm việc hoặc giao dịch với nhóm và cùng một công việc đếm, nó cũng đang xử lý cả nhóm,

bây giờ làm thế nào nó được tính là hoạt động như cả nhóm

tạo một bảng và nhập một số id và sau đó sử dụng:

select count(*) from table_name

bạn sẽ tìm thấy tổng giá trị có nghĩa là nó chỉ ra một số nhóm! nên wherekhông bổ sung với count();


1

COUNT (*) chỉ có thể được sử dụng với HAVING và phải được sử dụng sau câu lệnh GROUP BY Vui lòng tìm ví dụ sau:

SELECT COUNT(*), M_Director.PID FROM Movie
INNER JOIN M_Director ON Movie.MID = M_Director.MID 
GROUP BY M_Director.PID
HAVING COUNT(*) > 10
ORDER BY COUNT(*) ASC
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.