MySQL - ใช้ COUNT (*) ในส่วนคำสั่ง WHERE


157

ฉันพยายามทำสิ่งต่อไปนี้ใน MySQL (ดูpseudoรหัส)

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

มีวิธีการทำเช่นนี้โดยไม่ใช้ (SELECT ... ) ในส่วนคำสั่ง WHERE เพราะดูเหมือนว่าจะเป็นการสิ้นเปลืองทรัพยากร

คำตอบ:


264

ลองสิ่งนี้

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

37
+1 สำหรับการมีนี้เป็นเสมอประโยคที่ว่าพวกเขาไม่รำคาญที่จะสอนอย่างถูกต้องเกี่ยวกับหลักสูตร SQL หรือหนังสือและรู้เกี่ยวกับเรื่องนี้โดยทั่วไปหมายสำคัญว่า coder มีความก้าวหน้าเกินกว่าระดับสามเณร
Cruachan

ถ้าคุณพยายามใช้ COUNT () เป็นส่วนหนึ่งของบูลีนหรือนิพจน์ เช่นAND ((stock = 1 OR quantity > 0) OR (COUNT(v.id) > 0)
nnyby

ฉันคิดออก .. คุณสามารถเพิ่มไปยังข้อ HAVING ดังนี้:HAVING variations > 0 OR (stock = 1 OR quantity > 0)
nnyby

28

ฉันไม่แน่ใจเกี่ยวกับสิ่งที่คุณพยายามจะทำ ... อาจจะเป็นอะไรบางอย่าง

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

1
MSSQL ให้"ชื่อคอลัมน์ที่ไม่ถูกต้อง"numข้อผิดพลาดในการแยกวิเคราะห์สำหรับ +1 ต่อไปสำหรับไวยากรณ์ที่สะอาด (อาจเป็นการตั้งค่าของฉันหรือ ms ...
samis

ระบุชื่อแทนสำหรับคอลัมน์ทั้งหมดในส่วนที่เลือก
Adil Khalil

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

แก้ไข (ถ้าคุณต้องการแค่ gids):

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

ขอบคุณ Joe แต่นั่นคืน COUNT () - ฉันต้องการคืน gid ทั้งหมดที่มี COUNT (*) มากกว่า 10

1
ไม่จำเป็นต้องมี Min () ในนั้น
Ali Ersöz


14

เพียงแค่รุ่นวิชาการโดยไม่ต้องมีข้อ:

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

13

ไม่มีฟังก์ชั่นรวม (เช่น COUNT, MAX, ฯลฯ ) ใน A WHERE clause ดังนั้นเราจึงใช้ส่วนคำสั่ง HAVING แทน ดังนั้นข้อความค้นหาทั้งหมดจะคล้ายกับสิ่งนี้:

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

- ค้นหาสถานีอากาศที่ไม่มีบันทึกครึ่งชั่วโมง

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;

- รูปแบบของ yapiskan กับที่ .. เลือก ..


1

ฉันคิดว่าคุณไม่สามารถเพิ่มด้วยcount() whereตอนนี้ดูว่าทำไม ....

whereไม่ได้เช่นเดียวกับhaving, havingหมายถึงคุณกำลังทำงานหรือการจัดการกับกลุ่มและการทำงานที่เหมือนกันของการนับก็ยังต้องรับมือกับทั้งกลุ่ม

ตอนนี้นับว่ามันทำงานเป็นกลุ่มได้อย่างไร

สร้างตารางและป้อนรหัสบางส่วนแล้วใช้:

select count(*) from table_name

คุณจะพบค่าทั้งหมดหมายความว่ามีการระบุกลุ่ม! ดังนั้นwhereจะเพิ่มด้วยcount();


1

COUNT (*) สามารถใช้ได้กับ HAVING เท่านั้นและจะต้องใช้หลังจากคำสั่ง GROUP BY โปรดค้นหาตัวอย่างต่อไปนี้:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.