Nhận xét sơ bộ
Vui lòng học cách sử dụng ký hiệu JOIN rõ ràng, không phải ký hiệu tham gia ngầm định cũ (trước năm 1992).
Kiểu cũ:
SELECT transactionTable.rating as MostCommonRating
FROM personTable, transactionTable
WHERE personTable.transactionid = transactionTable.transactionid
AND personTable.personid = 1
GROUP BY transactionTable.rating
ORDER BY COUNT(transactionTable.rating) desc
LIMIT 1
Kiểu ưa thích:
SELECT transactionTable.rating AS MostCommonRating
FROM personTable
JOIN transactionTable
ON personTable.transactionid = transactionTable.transactionid
WHERE personTable.personid = 1
GROUP BY transactionTable.rating
ORDER BY COUNT(transactionTable.rating) desc
LIMIT 1
Bạn cần điều kiện BẬT cho mỗi THAM GIA.
Ngoài ra, personID
các giá trị trong dữ liệu là chuỗi, không phải số, vì vậy bạn cần viết
WHERE personTable.personid = "Ben"
ví dụ:để truy vấn hoạt động trên các bảng được hiển thị.
Câu trả lời chính
Bạn đang tìm kiếm một tổng thể của một tổng thể:trong trường hợp này là số lượng tối đa. Vì vậy, bất kỳ giải pháp chung nào sẽ liên quan đến cả MAX và COUNT. Bạn không thể áp dụng MAX trực tiếp cho COUNT, nhưng bạn có thể áp dụng MAX cho một cột từ truy vấn phụ trong đó cột đó là COUNT.
Xây dựng truy vấn bằng Thiết kế truy vấn theo hướng thử nghiệm - TDQD.
Chọn người và xếp hạng giao dịch
SELECT p.PersonID, t.Rating, t.TransactionID
FROM PersonTable AS p
JOIN TransactionTable AS t
ON p.TransactionID = t.TransactionID
Chọn người, xếp hạng và số lần xuất hiện xếp hạng
SELECT p.PersonID, t.Rating, COUNT(*) AS RatingCount
FROM PersonTable AS p
JOIN TransactionTable AS t
ON p.TransactionID = t.TransactionID
GROUP BY p.PersonID, t.Rating
Kết quả này sẽ trở thành một truy vấn phụ.
Tìm số lần tối đa một người nhận được bất kỳ xếp hạng nào
SELECT s.PersonID, MAX(s.RatingCount)
FROM (SELECT p.PersonID, t.Rating, COUNT(*) AS RatingCount
FROM PersonTable AS p
JOIN TransactionTable AS t
ON p.TransactionID = t.TransactionID
GROUP BY p.PersonID, t.Rating
) AS s
GROUP BY s.PersonID
Bây giờ chúng tôi biết đâu là số lượng tối đa cho mỗi người.
Kết quả bắt buộc
Để có được kết quả, chúng ta cần chọn các hàng từ truy vấn phụ có số lượng lớn nhất. Lưu ý rằng nếu ai đó có 2 xếp hạng Tốt và 2 xếp hạng Xấu (và 2 là số xếp hạng tối đa cùng loại cho người đó), thì hai bản ghi sẽ được hiển thị cho người đó.
SELECT s.PersonID, s.Rating
FROM (SELECT p.PersonID, t.Rating, COUNT(*) AS RatingCount
FROM PersonTable AS p
JOIN TransactionTable AS t
ON p.TransactionID = t.TransactionID
GROUP BY p.PersonID, t.Rating
) AS s
JOIN (SELECT s.PersonID, MAX(s.RatingCount) AS MaxRatingCount
FROM (SELECT p.PersonID, t.Rating, COUNT(*) AS RatingCount
FROM PersonTable AS p
JOIN TransactionTable AS t
ON p.TransactionID = t.TransactionID
GROUP BY p.PersonID, t.Rating
) AS s
GROUP BY s.PersonID
) AS m
ON s.PersonID = m.PersonID AND s.RatingCount = m.MaxRatingCount
Nếu bạn cũng muốn số lượng xếp hạng thực tế, thì bạn có thể dễ dàng chọn.
Đó là một phần SQL khá phức tạp. Tôi rất ghét phải thử viết nó từ đầu. Thật vậy, tôi có lẽ sẽ không bận tâm; Tôi sẽ phát triển nó từng bước, ít nhiều như hình minh họa. Nhưng vì chúng tôi đã gỡ lỗi các truy vấn phụ trước khi sử dụng chúng trong các biểu thức lớn hơn, chúng tôi có thể tự tin về câu trả lời.
Mệnh đề VỚI
Lưu ý rằng SQL tiêu chuẩn cung cấp một mệnh đề VỚI tiền tố một câu lệnh SELECT, đặt tên cho một truy vấn con. (Nó cũng có thể được sử dụng cho các truy vấn đệ quy, nhưng chúng ta không cần nó ở đây.)
WITH RatingList AS
(SELECT p.PersonID, t.Rating, COUNT(*) AS RatingCount
FROM PersonTable AS p
JOIN TransactionTable AS t
ON p.TransactionID = t.TransactionID
GROUP BY p.PersonID, t.Rating
)
SELECT s.PersonID, s.Rating
FROM RatingList AS s
JOIN (SELECT s.PersonID, MAX(s.RatingCount) AS MaxRatingCount
FROM RatingList AS s
GROUP BY s.PersonID
) AS m
ON s.PersonID = m.PersonID AND s.RatingCount = m.MaxRatingCount
Điều này đơn giản hơn để viết. Rất tiếc, MySQL chưa hỗ trợ mệnh đề WITH.
SQL ở trên hiện đã được kiểm tra dựa trên IBM Informix Dynamic Server 11.70.FC2 chạy trên Mac OS X 10.7.4. Thử nghiệm đó cho thấy vấn đề được chẩn đoán trong nhận xét sơ bộ. SQL cho câu trả lời chính hoạt động chính xác mà không cần thay đổi.