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

DISTINCT TRÊN truy vấn w / ORDER THEO giá trị tối đa của một cột

Điều đó sẽ đơn giản. Bạn không cần max() cũng không phải DISTINCT cho điều này:

SELECT *
FROM   profile_visits
WHERE  social_user_id = 21
AND    created_at > (now() - interval '2 months')
AND    visitor_id <> 21  -- ??
ORDER  BY created_at DESC NULLS LAST, id DESC NULLS LAST
LIMIT  6;

Tôi nghi ngờ câu hỏi của bạn là không đầy đủ. Nếu bạn muốn:
6 khách truy cập mới nhất có lượt truy cập mới nhất vào trang
thì bạn cần một truy vấn con. Bạn không thể nhận thứ tự sắp xếp này ở một cấp truy vấn, với DISTINCT ON , cũng như với các chức năng cửa sổ:

SELECT *
FROM  (
   SELECT DISTINCT ON (visitor_id) *
   FROM   profile_visits
   WHERE  social_user_id = 21
   AND    created_at > (now() - interval '2 months')
   AND    visitor_id <> 21  -- ??
   ORDER  BY visitor_id, created_at DESC NULLS LAST, id DESC NULLS LAST
   ) sub
ORDER  BY created_at DESC NULLS LAST, id DESC NULLS LAST
LIMIT  6;

Truy vấn con sub nhận được lượt truy cập mới nhất cho mỗi người dùng (nhưng không quá hai tháng và không dành cho một khách truy cập nhất định 21 . ORDER BY phải có các cột ở đầu giống như DISTINCT ON .

Khi đó, bạn cần truy vấn bên ngoài để có được 6 khách truy cập mới nhất.
Hãy xem xét chuỗi sự kiện:

Tại sao NULLS LAST ? Để chắc chắn, bạn đã không cung cấp định nghĩa bảng.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. giới hạn truy vấn con mySQL

  2. Trung bình trên một số lượng () trong cùng một truy vấn

  3. Chọn một hàng và các hàng xung quanh nó

  4. Lựa chọn câu hỏi ngẫu nhiên từ cơ sở dữ liệu MySQL; câu trả lời đúng bị lộn xộn

  5. Cách tìm và thay thế văn bản trong bảng mysql