2012-01-20 74 views
7

Tôi đang cố tính số lần xuất hiện của một tập hợp thành phố và quốc gia riêng biệt trong bảng người dùng.Việc đếm số lần xuất hiện của nhiều cột riêng biệt trong SQL

Bảng này được đặt ra tương tự như:

userid city  country 
------ --------- -------------- 
1  Cambridge United Kingdom 
2  London  United Kingdom 
3  Cambridge United Kingdom 
4  New York United States 

Những gì tôi cần là một danh sách của tất cả các thành phố, cặp quốc gia có số lần xuất hiện:

Cambridge, United Kingdom, 2 
London, United Kingdom, 1 
New York, United States, 1 

Hiện nay tôi chạy một truy vấn SQL để có được các cặp riêng biệt:

$array = SELECT DISTINCT city, country FROM usertable 

sau đó đọc nó thành một mảng trong PHP và lặp qua mảng, chạy một truy vấn để đếm mỗi lần xuất hiện cho mỗi hàng trong mảng:

SELECT count(*) FROM usertable 
WHERE city = $array['city'] 
AND country = $array['country'] 

Tôi giả định nắm rất ít của tôi về SQL thiếu một cái gì đó - những gì sẽ là cách chính xác để làm điều này, tốt nhất là không có sự can thiệp của PHP?

Trả lời

13
select city, country, count(*) 
from usertable 
group by city, country 
+0

Tốc độ đáp ứng ngoạn mục - cảm ơn rất nhiều, đã làm việc một cách hoàn hảo (sẽ chấp nhận câu trả lời ngay khi nó cho phép tôi) –

5

Những gì bạn cần là một nhóm bởi:

Select city, country, count(*) as counter 
from usertable 
group by city, country 
+0

Cảm ơn bạn đã trả lời rất nhanh - hoàn hảo! –

1
SELECT cityandcountry, count(*) as occurrences FROM (
    SELECT DISTINCT concat(city, country) FROM tablename 
) as baseview; 

nếu bạn muốn thành phố và đất nước preformated, hoặc

SELECT cityandcountry, count(*) as occurrences FROM (
    SELECT DISTINCT city, country FROM tablename 
) as baseview; 

nếu không muốn nói.

+0

Cảm ơn - hãy thử tính năng này trong MySQL và nhận được lỗi sau: 'Mọi bảng có nguồn gốc phải có bí danh riêng' –

+0

Xin lỗi, lỗi của tôi. Tôi đã chỉnh sửa câu trả lời của mình để sửa lại điều đó. –

+0

Tôi tin rằng điều này sẽ không hoạt động. Mỗi 'count (*)' sẽ chỉ là tổng số hàng trong 'baseview', không phải là những gì OP muốn. –

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