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

SQL:Trả lại giá trị chung nhất cho mỗi người

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql - cần hai giới hạn?

  2. php mysqli_connect:phương thức xác thực không xác định đối với ứng dụng khách [caching_sha2_password]

  3. Sử dụng trình kích hoạt MySQL

  4. Hàm MAX trong mệnh đề mysql ở đâu

  5. MySQL Chọn WHERE trong thứ tự nhất định