SQL: วิธีการนับจำนวนของค่าที่แตกต่างกันในคอลัมน์?


176

ฉันมีตาราง SQL ชื่อ "posts" ที่มีลักษณะดังนี้:

id | category
-----------------------
1  | 3
2  | 1
3  | 4
4  | 2
5  | 1
6  | 1
7  | 2

หมายเลขหมวดหมู่แต่ละรายการสอดคล้องกับหมวดหมู่ ฉันจะนับจำนวนครั้งที่แต่ละหมวดหมู่ปรากฏในโพสต์ทั้งหมดในแบบสอบถาม SQL หนึ่งรายการได้อย่างไร

เป็นตัวอย่างแบบสอบถามดังกล่าวอาจส่งกลับอาร์เรย์สัญลักษณ์เช่นนี้ (1:3, 2:2, 3:1, 4:1)


วิธีการปัจจุบันของฉันคือการใช้แบบสอบถามสำหรับแต่ละประเภทที่เป็นไปได้เช่น: SELECT COUNT(*) AS num FROM posts WHERE category=#แล้วรวมค่าส่งคืนลงในอาร์เรย์สุดท้าย อย่างไรก็ตามฉันกำลังมองหาโซลูชันที่ใช้แบบสอบถามเพียงรายการเดียว


คำตอบ:


311
SELECT
  category,
  COUNT(*) AS `num`
FROM
  posts
GROUP BY
  category

3
ขอบคุณ! มันง่ายกว่าที่ฉันคิดไว้เยอะมาก!
Jeff Gortmaker

4
@MichelAyres: แหล่งที่มา?
Moberg

5
"นั่นคือมาตรฐาน ANSI รับรู้ว่ามีเลือดออกอย่างชัดเจนว่าคุณหมายถึงอะไร COUNT (1) ได้รับการปรับให้เหมาะสมโดยผู้ขาย RDBMS เนื่องจากความเชื่อโชคลางนี้มิฉะนั้นจะถูกประเมินตาม ANSI" Count (*) vs Count (1)
Michel Ayres

@Moberg มันเป็นวิธีที่ฉันได้เรียนรู้ (คนเฒ่าคนแก่สอนไสยศาสตร์ ... ) นี่เป็นส่วนเล็ก ๆ ของการแชทเพื่อพูดคุยเกี่ยวกับมัน
Michel Ayres

1
มันทำงาน "มี" เมื่อคุณใช้ชื่อคอลัมน์และตารางที่มีอยู่ในตัวอย่าง
Dan Grossman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.