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

truy vấn mySQL - hiển thị mục phổ biến nhất

Đề xuất ban đầu của tôi không chính xác :

SELECT
  date, item, SUM(cnt)
FROM (
  SELECT
    date, item, count(item_id) AS cnt
  FROM test_popularity
  GROUP BY date, item_id
  ORDER BY cnt DESC
) t
GROUP BY date;

Điều này giả định một cách sai lầm rằng tập hợp bên ngoài (theo ngày) sẽ chọn hàng đầu tiên của bảng dẫn xuất bên trong được sắp xếp theo cnt. Trên thực tế, hành vi này là không xác định và không được đảm bảo là nhất quán.

Đây là giải pháp thích hợp:

SELECT
  t1.date, t1.item, 
  (SELECT COUNT(*) FROM test_popularity WHERE date = t1.date) as total
  # see note!
FROM test_popularity t1
JOIN (
  SELECT date, item, item_id, COUNT(item_id) as count
  FROM test_popularity
  GROUP BY date, item_id
) AS t2
ON t1.date = t2.date AND t1.item_id = t2.item_id
GROUP BY t1.date;

Lưu ý:

Tôi đã thêm tổng số (SELECT COUNT(*)) AS total bởi vì câu hỏi yêu cầu điều này trong một truy vấn. Tuy nhiên, điều này sẽ không mở rộng quy mô vì nó là một truy vấn con tương quan. Điều này có nghĩa là cứ mỗi t1.date, truy vấn con SELECT COUNT (*) sẽ chạy. Vui lòng đánh giá điểm chuẩn và xem liệu nó có hoạt động phù hợp với nhu cầu của bạn hay không. Nếu không, thì tôi khuyên bạn nên lấy tổng số hàng ngày trong một truy vấn riêng biệt. Bạn sẽ hợp nhất các kết quả này trong ứng dụng của mình.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tính toán phần trăm từ lần truy cập gần đây trong MySQL

  2. Lỗi cắt ngắn dữ liệu MySQL

  3. Hướng dẫn thiết kế cơ sở dữ liệu cho sự kiện lịch và lời nhắc trong MySQL

  4. Cách nhận ID chữ-số tiếp theo dựa trên giá trị hiện có từ MySQL

  5. Nhận độ dài tối đa được phép trong cột, mysql