SELECT t1.*
FROM (SELECT tag, category, COUNT(*) AS count
FROM tags INNER JOIN stuff USING (id)
GROUP BY tag, category) t1
LEFT OUTER JOIN
(SELECT tag, category, COUNT(*) AS count
FROM tags INNER JOIN stuff USING (id)
GROUP BY tag, category) t2
ON (t1.tag = t2.tag AND (t1.count < t2.count
OR t1.count = t2.count AND t1.category < t2.category))
WHERE t2.tag IS NULL
ORDER BY t1.count DESC;
Tôi đồng ý rằng đây là loại quá nhiều cho một truy vấn SQL. Mọi việc sử dụng GROUP BY
bên trong một truy vấn con khiến tôi nhăn mặt. Bạn có thể làm cho nó trông đơn giản hơn bằng cách sử dụng các chế độ xem:
CREATE VIEW count_per_category AS
SELECT tag, category, COUNT(*) AS count
FROM tags INNER JOIN stuff USING (id)
GROUP BY tag, category;
SELECT t1.*
FROM count_per_category t1
LEFT OUTER JOIN count_per_category t2
ON (t1.tag = t2.tag AND (t1.count < t2.count
OR t1.count = t2.count AND t1.category < t2.category))
WHERE t2.tag IS NULL
ORDER BY t1.count DESC;
Nhưng về cơ bản, nó thực hiện cùng một công việc đằng sau hậu trường.
Bạn nhận xét rằng bạn có thể thực hiện một thao tác tương tự một cách dễ dàng trong mã ứng dụng. Vậy tại sao bạn không làm điều đó? Thực hiện truy vấn đơn giản hơn để nhận số lượng cho mỗi danh mục:
SELECT tag, category, COUNT(*) AS count
FROM tags INNER JOIN stuff USING (id)
GROUP BY tag, category;
Và sắp xếp thông qua kết quả trong mã ứng dụng.