MySQL - Menggunakan COUNT (*) dalam klausa WHERE

157

Saya mencoba mencapai yang berikut ini di MySQL (lihat pseudokode)

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

Apakah ada cara untuk melakukan ini tanpa menggunakan (PILIH ...) dalam klausa WHERE karena itu akan tampak seperti pemborosan sumber daya.

shgnInc
sumber

Jawaban:

265

coba ini;

select gid
from `gd`
group by gid 
having count(*) > 10
order by lastupdated desc
Ali Ersöz
sumber
37
+1 untuk memiliki Ini selalu merupakan klausa bahwa Mereka Tidak Perlu Mengajar Dengan Benar pada kursus atau buku sql dan mengetahuinya secara umum tanda bahwa pembuat kode telah berkembang melampaui tingkat pemula.
Cruachan
Bagaimana jika Anda mencoba menggunakan COUNT () sebagai bagian dari ekspresi boolean OR? misAND ((stock = 1 OR quantity > 0) OR (COUNT(v.id) > 0)
nnyby
Saya menemukan HAVING variations > 0 OR (stock = 1 OR quantity > 0)
jawabannya
28

Saya tidak yakin tentang apa yang Anda coba lakukan ... mungkin sesuatu seperti

SELECT gid, COUNT(*) AS num FROM gd GROUP BY gid HAVING num > 10 ORDER BY lastupdated DESC
Greg
sumber
1
MSSQL memberikan kesalahan parse "nama kolom tidak valid" untuk num. +1 tetap untuk sintaks bersih (bisa jadi setup saya, atau ms ... ahh well).
samis
Berikan alias untuk semua kolom di pilih.
Adil Khalil
18
SELECT COUNT(*)
FROM `gd`
GROUP BY gid
HAVING COUNT(gid) > 10
ORDER BY lastupdated DESC;

Sunting (jika Anda hanya menginginkan gids):

SELECT MIN(gid)
FROM `gd`
GROUP BY gid
HAVING COUNT(gid) > 10
ORDER BY lastupdated DESC
Winston Smith
sumber
Terima kasih Joe, tetapi itu mengembalikan COUNT () - Saya ingin mengembalikan semua gid yang memiliki COUNT (*) lebih dari 10
1
Tidak perlu Min () di sana.
Ali Ersöz
14

mencoba

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

Hanya versi akademis tanpa klausa:

select *
from (
   select gid, count(*) as tmpcount from gd group by gid
) as tmp
where tmpcount > 10;
Máťa - Stitod.cz
sumber
13

Tidak boleh ada fungsi agregat (mis. COUNT, MAX, dll.) Dalam klausa WHERE. Karenanya, kami menggunakan klausa HAVING. Karenanya seluruh permintaan akan serupa dengan ini:

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;
pushkarr
sumber
6

- Mencari stasiun cuaca dengan catatan setengah jam yang hilang

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;

- variasi yapiskan dengan tempat .. di .. pilih

zzapper
sumber
1

saya pikir Anda tidak dapat menambahkan count()dengan where. sekarang lihat mengapa ....

wheretidak sama dengan having, havingberarti Anda bekerja atau berhadapan dengan kelompok dan pekerjaan menghitung yang sama, itu juga berurusan dengan seluruh kelompok,

sekarang bagaimana menghitungnya berfungsi sebagai kelompok keseluruhan

buat tabel dan masukkan beberapa id lalu gunakan:

select count(*) from table_name

Anda akan menemukan nilai total berarti menunjukkan beberapa grup! demikian wherejuga ditambahkan dengan count();

Tushar Pandey
sumber
1

COUNT (*) hanya dapat digunakan dengan HAVING dan harus digunakan setelah pernyataan GROUP BY. Silakan temukan contoh berikut:

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
Mridul Pandey
sumber