2008-10-26 30 views
15

Hãy tưởng tượng tôi có bảng như thế này:Làm thế nào để đếm các bản ghi duy nhất và nhận được số lượng các đơn này trong bảng bằng cách sử dụng SQL?

id: Sản phẩm: shop_id

1: Bóng rổ: 41

2: Bóng đá: 41

3: Rocket: 45

4: Ô tô: 86

5: Máy bay: 86

Bây giờ, đây là một ví dụ về trung tâm internet lớn, nơi có các cửa hàng bán cho một khách hàng, vì vậy khách hàng có thể chọn nhiều sản phẩm hơn từ mỗi cửa hàng và mua trong một giỏ.

Tuy nhiên, tôi không chắc liệu có bất kỳ cú pháp SQL nào cho phép tôi chỉ nhận các shop_ids độc đáo và tổng số sản phẩm của cửa hàng đó trong giỏ hàng của khách hàng hay không. Vì vậy, tôi muốn có được một cái gì đó như:

Cửa hàng 41 có 2 sản phẩm

Cửa hàng 45 một sản phẩm

Cửa hàng 86 sản phẩm hai

tôi có thể làm cho các truy vấn SQL để múc qua bảng để làm cho một số loại của ['shop_id'] ['number_of_products'] biến mảng sẽ lưu trữ tất cả các cửa hàng của sản phẩm, sau đó "duy nhất chúng" - lên và đếm bao nhiêu lần tôi đã phải cắt thêm một shop_id ra để có một số còn lại nhưng điều đó có vẻ như rất nhiều kịch bản vô dụng.

Nếu bạn có một số ý tưởng tốt đẹp và gọn gàng, hãy cho tôi biết.

Trả lời

31

Đây chính xác là điều mà các chức năng tổng hợp dành cho. Bạn tạo một hàng đầu ra cho mỗi nhóm hàng trong bảng. Nhóm chúng theo shop_id và đếm số lượng hàng trong mỗi nhóm.

select shop_id, count(1) from TABLE_NAME 
    group by shop_id 
+0

(1) sau khi Đếm có nghĩa là tham số nào sau khi chọn SELECT sẽ được tính? – Skuta

+2

Không, (1) không phải là tham chiếu đến bất kỳ cột nào, nó chỉ là giá trị số nguyên 1. Nó điển hình hơn khi sử dụng COUNT (*) hoặc COUNT (tên cột). Glomek đang sử dụng COUNT (1) làm giá trị số nguyên không đổi, bởi vì một số người tin rằng điều này nhanh hơn so với tham chiếu một cột. –

+0

Trình tối ưu hóa * nên * chú ý đến việc đếm (*) mất nhiều thời gian khi đếm (1). Tôi đoán một số người tối ưu hóa thì không. – yfeldblum

Các vấn đề liên quan