SQL Group By với một Order By


122

Tôi có một bảng các thẻ và muốn lấy các thẻ có số lượng cao nhất từ ​​danh sách.

Dữ liệu mẫu trông như thế này

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

sử dụng

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

giúp tôi lấy lại dữ liệu mà tôi đang tìm kiếm một cách hoàn hảo. Tuy nhiên, tôi muốn sắp xếp nó sao cho số lượng thẻ cao nhất được xếp đầu tiên và giới hạn nó chỉ gửi cho tôi khoảng 20 thẻ đầu tiên.

Tôi đã thử cái này ...

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

và tôi tiếp tục nhận được thông báo "Sử dụng chức năng nhóm không hợp lệ - ErrNr 1111"

Tôi đang làm gì sai?

Tôi đang sử dụng MySQL 4.1.25-Debian

Câu trả lời:


199

Trong tất cả các phiên bản của MySQL, chỉ cần đặt bí danh là tổng hợp trong danh sách CHỌN và sắp xếp theo bí danh:

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

9
IMHO, đây là phiên bản rõ ràng hơn câu trả lời đã chọn. Nó ngay lập tức rõ ràng những gì được đặt hàng theo. Tất nhiên, nếu nó là một kịch bản nhanh, điều đó không thực sự quan trọng.
JustAPoring

1
Mặc dù OP đang sử dụng MySQL, câu trả lời này cũng làm việc cho tôi trong HSQL (LibreOffice built-in)
Arno Teigseth

53

MySQL trước phiên bản 5 không cho phép các hàm tổng hợp trong mệnh đề ORDER BY.

Bạn có thể vượt qua giới hạn này với cú pháp không dùng nữa:

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

1, vì đây là cột đầu tiên bạn muốn nhóm vào.


8

Tôi không biết về MySQL, nhưng trong MS SQL, bạn có thể sử dụng chỉ mục cột trong order bymệnh đề. Tôi đã làm điều này trước đây khi thực hiện đếm với group bys vì nó có xu hướng dễ dàng hơn để làm việc với.

Vì thế

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

Trở thành

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

6

Trong Oracle, một cái gì đó như thế này hoạt động độc đáo để tách việc đếm và sắp xếp của bạn tốt hơn một chút. Tôi không chắc liệu nó có hoạt động trong MySql 4 hay không.

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

Có vẻ như phù hợp với tôi trong 10.1.14-MariaDB (tương thích với MySQL). Tôi nghĩ rằng tôi phải có ) as counts, nhưng nó vẫn hoạt động mà không có asphần.
Harry Pehkonen

3

Bạn có thể vượt qua giới hạn này với cú pháp không dùng nữa: ORDER BY 1 DESC

Cú pháp này hoàn toàn không bị phản đối, nó là E121-03 từ SQL99.


5
Đây nên là một bình luận thay vì một câu trả lời.
Rafael Barros

0

Hãy thử truy vấn này

 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

Điều này có liên quan gì đến câu hỏi? Các trường thậm chí không giống nhau.
Blakes Seven,
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.