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

ĐẶT HÀNG THEO Truy vấn con cho GROUP BY để THAM GIA chuyển đổi

Điều này có thể được đơn giản hóa thành như sau (ORDER BY trong truy vấn con là vô ích):

SELECT * 
FROM table
GROUP BY title

Tại sao bạn nghĩ rằng bạn cần JOIN ? (Được rồi, điều này đã được giải quyết bằng nhận xét).

Sau nhận xét của bạn rằng bạn cần cho mọi tiêu đề, hàng có dấu thời gian lớn nhất, điều này sẽ thực hiện công việc:

SELECT t.* 
FROM
    table AS t
  JOIN
    ( SELECT title
           , MAX(timestamp) AS maxts
      FROM table
      GROUP BY title
    ) AS grp
    ON grp.title = t.title
    AND grp.maxts = t.timestamp
ORDER BY t.timestamp DESC

Đối với bản ghi, truy vấn ban đầu của bạn:

SELECT * 
FROM 
  ( SELECT * 
    FROM table 
    ORDER BY timestamp DESC 
  ) m
GROUP BY title

có thể hoạt động như mong đợi, nhưng: chỉ trong MySQL cho phép bạn sử dụng trong SELECT liệt kê các trường không có trong GROUP BY mệnh đề (hoặc phụ thuộc vào chúng), mà không có bất kỳ hàm tổng hợp nào trong chúng. Vì vậy, truy vấn trên sẽ trả về nhiều hơn hoặc ít ngẫu nhiên hơn hàng cho mọi tiêu đề. Trên thực tế, nó sẽ trả về hàng đầu tiên mà nó sẽ tìm thấy cho một tiêu đề. Vì vậy, lần đầu tiên chạy truy vấn con (yêu cầu theo timestamp DESC ) dẫn đến việc tìm thấy hàng đầu tiên có dấu thời gian lớn nhất.

Tuy nhiên, điều này chỉ xảy ra bởi vì (khi, nếu) trình tối ưu hóa không hiểu rằng truy vấn con là vô dụng. Bạn có thể thấy rằng truy vấn ban đầu của bạn chạy tốt khi một ngày bạn nâng cấp lên MySQL phiên bản 7.5 và truy vấn của bạn ngừng hoạt động như trước. (bởi vì trình tối ưu hóa đã thông minh hơn và đã dịch truy vấn của bạn thành một truy vấn đơn giản hơn mà không có lựa chọn phụ).

Bạn thậm chí có thể thấy truy vấn của mình ngừng hoạt động hoàn toàn và tạo ra lỗi nếu MySQL quyết định trong bản phát hành trong tương lai tuân theo các tiêu chuẩn SQL cho GROUP BY truy vấn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thiết kế cơ sở dữ liệu cho các ứng dụng sử dụng thẻ bắt đầu bằng #

  2. Địa chỉ ràng buộc và máy chủ MySQL

  3. Sử dụng Mysql trong dòng lệnh trong osx - không tìm thấy lệnh?

  4. Tại sao không nên tắt ONLY_FULL_GROUP_BY

  5. Cách tìm số ngày giữa hai ngày trong MySQL