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

Truy vấn:đếm nhiều tổng hợp cho mỗi mục

Đây là một mẹo:tính toán SUM() của các giá trị được biết là 1 hoặc 0 tương đương với COUNT() của các hàng có giá trị là 1. Và bạn biết rằng so sánh boolean trả về 1 hoặc 0 (hoặc NULL).

SELECT c.catname, COUNT(m.catid) AS item_count,
  SUM(i.ownerid = @ownerid) AS owner_item_count
FROM categories c
  LEFT JOIN map m USING (catid)
  LEFT JOIN items i USING (itemid)
GROUP BY c.catid;

Đối với câu hỏi phần thưởng, bạn có thể chỉ cần thực hiện một phép nối bên trong thay vì phép nối bên ngoài, nghĩa là chỉ các danh mục có ít nhất một hàng trong map sẽ được trả lại.

SELECT c.catname, COUNT(m.catid) AS item_count,
  SUM(i.ownerid = @ownerid) AS owner_item_count
FROM categories c
  INNER JOIN map m USING (catid)
  INNER JOIN items i USING (itemid)
GROUP BY c.catid;

Đây là một giải pháp khác, không hiệu quả bằng nhưng tôi sẽ hiển thị nó để giải thích tại sao bạn gặp lỗi:

SELECT c.catname, COUNT(m.catid) AS item_count,
  SUM(i.ownerid = @ownerid) AS owner_item_count
FROM categories c
  LEFT JOIN map m USING (catid)
  LEFT JOIN items i USING (itemid)
GROUP BY c.catid
HAVING item_count > 0;

Bạn không thể sử dụng bí danh cột trong WHERE mệnh đề, bởi vì các biểu thức trong WHERE mệnh đề được đánh giá trước các biểu thức trong danh sách chọn. Nói cách khác, các giá trị được liên kết với các biểu thức danh sách chọn chưa có sẵn.

Bạn có thể sử dụng bí danh cột trong GROUP BY , HAVINGORDER BY điều khoản. Các mệnh đề này được chạy sau khi tất cả các biểu thức trong danh sách chọn đã được đánh giá.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chèn dữ liệu bằng mảng đa chiều từ nhiều trường

  2. Sử dụng cơ sở dữ liệu XAMPP MySql từ một máy tính khác

  3. Sự khác biệt giữa các ngày trong hai hàng liên tiếp

  4. Làm cách nào để chọn giữa ngày đầu tiên của tháng hiện tại và ngày hiện tại trong MySQL?

  5. Sự cố khởi động máy chủ MySQL trên Mavericks