2010-04-05 27 views
11

Tôi có một bảng trong cơ sở dữ liệu có nhiều bản ghi, một số bản ghi có chung giá trị cho một trong các cột. ví dụ.Chọn giá trị phổ biến nhất từ ​​quan hệ - câu lệnh SQL

| id | name | software | 
______________________________ 
| 1 | john | photoshop | 
| 2 | paul | photoshop | 
| 3 | gary | textmate | 
| 4 | ade | fireworks | 
| 5 | fred | textmate | 
| 6 | bob | photoshop | 

Tôi muốn trả về giá trị của mảnh xảy ra phổ biến nhất của các phần mềm, bằng cách sử dụng một câu lệnh SQL.

Vì vậy, trong ví dụ trên câu lệnh SQL yêu cầu sẽ trả về 'photoshop' vì nó xảy ra nhiều hơn bất kỳ phần mềm nào khác.

Điều này có khả thi không?

Cảm ơn bạn đã dành thời gian.

+2

@Ronnie: phiên bản cơ sở dữ liệu bạn đang sử dụng? MySQL? Oracle? –

+0

Xin lỗi, tôi đang sử dụng MySQL. – Ronnie

+0

có thể trùng lặp của [Nhận giá trị phổ biến nhất trong SQL] (http://stackoverflow.com/questions/344665/get-most-common-value-in-sql) – user2284570

Trả lời

22
select top 1 software 
from your_table 
group by software 
order by count(*) desc 
+0

Cảm ơn Carl, phần 'top 1' có nghĩa là gì ? Cảm ơn cho phản ứng nhanh chóng của bạn. – Ronnie

+1

@Ronnie nó trả về từ đầu các kết quả từ truy vấn, trong trường hợp này là giảm dần, số bản ghi được ghi là – msarchet

+0

Vì vậy, câu lệnh này sẽ sắp xếp tất cả các bản ghi trong nhóm bắt đầu bằng nhóm phần mềm phổ biến nhất và giảm dần. Nhưng 'top 1' chỉ chọn giá trị từ nhóm đầu tiên? – Ronnie

4

Nó phụ thuộc nếu bạn muốn sử dụng SQL tiêu chuẩn hoặc nhà cung cấp phần mở rộng cụ thể (một poster có một truy vấn "đầu N", đó là không tiêu chuẩn). Một giải pháp tiêu chuẩn sẽ là.

SELECT software, COUNT(1) 
FROM tablename 
GROUP BY software 
HAVING COUNT(1) = (
    SELECT MAX(sc) FROM (
    SELECT software, COUNT(1) sc 
    FROM tablename 
    GROUP BY software 
) 
) 

Lưu ý: này có thể trở nhiều hàng nếu một vài miếng của phần mềm được gắn cho hầu hết các lần xuất hiện.

0

Bạn có thể làm điều đó bằng nhiều cách nhưng cách đơn giản nhất sẽ là này

SELECT item 
FROM (SELECT item FROM your_table GROUP BY item ORDER BY COUNT(*) desc) 
WHERE ROWNUM<=1; 
+0

MySQL không có 'ROWNUM'. – Barmar

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