Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL SELECT thường xuyên nhất theo nhóm

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thứ tự các trường trong mệnh đề WHERE có ảnh hưởng đến hiệu suất trong MySQL không?

  2. Ví dụ về WEEKOFYEAR () - MySQL

  3. Cách thu hút người dùng mới mỗi ngày trong MySQL

  4. Đơn vị thời gian trong nhật ký truy vấn chậm của MySQL là gì?

  5. Tạo kiểu biến ENUM trong MySQL