SQL จัดกลุ่มตามคำสั่งโดย


122

ฉันมีตารางแท็กและต้องการรับแท็กที่มีจำนวนสูงสุดจากรายการ

ตัวอย่างข้อมูลมีลักษณะดังนี้

id (1) tag ('night')
id (2) tag ('awesome')
id (3) tag ('night')

การใช้

SELECT COUNT(*), `Tag` from `images-tags`
GROUP BY `Tag`

ทำให้ฉันได้รับข้อมูลที่ต้องการกลับคืนมาอย่างสมบูรณ์แบบ อย่างไรก็ตามฉันต้องการจัดระเบียบเพื่อให้จำนวนแท็กสูงสุดเป็นอันดับแรกและ จำกัด ให้ส่งได้เพียง 20 อันดับแรกเท่านั้น

ฉันลองสิ่งนี้ ...

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY COUNT(id) DESC
LIMIT 20

และฉันได้รับข้อความ "การใช้ฟังก์ชันกลุ่มไม่ถูกต้อง - ErrNr 1111"

ผมทำอะไรผิดหรือเปล่า?

ฉันใช้ MySQL 4.1.25-Debian

คำตอบ:


199

ใน MySQL ทุกเวอร์ชันเพียงแค่ใช้นามแฝงการรวมในรายการ SELECT และเรียงลำดับตามนามแฝง:

SELECT COUNT(id) AS theCount, `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY theCount DESC
LIMIT 20

9
IMHO นี่เป็นเวอร์ชันที่สะอาดกว่าคำตอบที่เลือก มันชัดเจนทันทีว่าอะไรคือคำสั่ง แน่นอนว่าถ้าเป็นสคริปต์ด่วนนั่นก็ไม่สำคัญ
JustAPoring

1
แม้ว่า OP จะใช้ MySQL แต่คำตอบนี้ก็ใช้ได้กับฉันใน HSQL (Libreoffice built-in)
Arno Teigseth

53

MySQL ก่อนเวอร์ชัน 5 ไม่อนุญาตให้ใช้ฟังก์ชันการรวมในคำสั่ง ORDER BY

คุณสามารถหลีกเลี่ยงขีด จำกัด นี้ได้ด้วยไวยากรณ์ที่เลิกใช้แล้ว:

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY 1 DESC
LIMIT 20

1 เนื่องจากเป็นคอลัมน์แรกที่คุณต้องการจัดกลุ่ม


8

ฉันไม่รู้เกี่ยวกับ MySQL แต่ใน MS SQL คุณสามารถใช้ดัชนีคอลัมน์ในorder byอนุประโยคได้ ฉันเคยทำสิ่งนี้มาก่อนเมื่อทำการนับด้วยgroup bys เนื่องจากมีแนวโน้มที่จะทำงานได้ง่ายขึ้น

ดังนั้น

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY COUNT(id) DESC
LIMIT 20

กลายเป็น

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER 1 DESC
LIMIT 20

6

ใน Oracle สิ่งนี้ใช้ได้ดีในการแยกการนับของคุณและการสั่งซื้อที่ดีขึ้นเล็กน้อย ฉันไม่แน่ใจว่ามันจะใช้ได้ใน MySql 4 หรือไม่

select 'Tag', counts.cnt
from
  (
  select count(*) as cnt, 'Tag'
  from 'images-tags'
  group by 'tag'
  ) counts
order by counts.cnt desc

ดูเหมือนว่าจะทำงานให้ฉันใน 10.1.14-MariaDB (เข้ากันได้กับ MySQL) ฉันคิดว่าฉันต้องมี) as countsแต่มันก็ยังทำงานได้โดยไม่มีasส่วน
Harry Pehkonen

3

คุณสามารถหลีกเลี่ยงขีด จำกัด นี้ได้ด้วยไวยากรณ์ที่เลิกใช้แล้ว: ORDER BY 1 DESC

ไวยากรณ์นี้ไม่ได้เลิกใช้เลย แต่เป็น E121-03 จาก SQL99


5
นี่ควรเป็นความคิดเห็นแทนคำตอบ
Rafael Barros

0

ลองใช้แบบสอบถามนี้

 SELECT  data_collector_id , count (data_collector_id ) as frequency 
    from rent_flats 
    where is_contact_person_landlord = 'True' 
    GROUP BY data_collector_id 
    ORDER BY count(data_collector_id) DESC

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