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

Thứ tự MySQL theo nhóm trước

Sử dụng ORDER BY trong một truy vấn con không phải là giải pháp tốt nhất cho vấn đề này.

Giải pháp tốt nhất để có được max(post_date) của tác giả là sử dụng một truy vấn con để trả về ngày tối đa và sau đó nối ngày đó vào bảng của bạn trên cả post_author và ngày tối đa.

Giải pháp nên là:

SELECT p1.* 
FROM wp_posts p1
INNER JOIN
(
    SELECT max(post_date) MaxPostDate, post_author
    FROM wp_posts
    WHERE post_status='publish'
       AND post_type='post'
    GROUP BY post_author
) p2
  ON p1.post_author = p2.post_author
  AND p1.post_date = p2.MaxPostDate
WHERE p1.post_status='publish'
  AND p1.post_type='post'
order by p1.post_date desc

Nếu bạn có dữ liệu mẫu sau:

CREATE TABLE wp_posts
    (`id` int, `title` varchar(6), `post_date` datetime, `post_author` varchar(3))
;

INSERT INTO wp_posts
    (`id`, `title`, `post_date`, `post_author`)
VALUES
    (1, 'Title1', '2013-01-01 00:00:00', 'Jim'),
    (2, 'Title2', '2013-02-01 00:00:00', 'Jim')
;

Truy vấn con sẽ trả về ngày tối đa và tác giả của:

MaxPostDate | Author
2/1/2013    | Jim

Sau đó, vì bạn đang tham gia đó trở lại bảng, trên cả hai giá trị, bạn sẽ trả lại toàn bộ chi tiết của bài đăng đó.

Xem SQL Fiddle with Demo .

Để mở rộng nhận xét của tôi về việc sử dụng truy vấn con để trả về chính xác dữ liệu này.

MySQL không buộc bạn phải GROUP BY mọi cột mà bạn đưa vào SELECT danh sách. Do đó, nếu bạn chỉ GROUP BY một cột nhưng trả về tổng cộng 10 cột, không có gì đảm bảo rằng các giá trị cột khác thuộc về post_author được trả lại. Nếu cột không nằm trong GROUP BY MySQL chọn giá trị nào sẽ được trả về.

Sử dụng truy vấn con với chức năng tổng hợp sẽ đảm bảo rằng tác giả và bài đăng chính xác được trả lại mọi lúc.

Lưu ý thêm, trong khi MySQL cho phép bạn sử dụng ORDER BY trong một truy vấn con và cho phép bạn áp dụng GROUP BY không phải mọi cột trong SELECT liệt kê hành vi này không được phép trong các cơ sở dữ liệu khác bao gồm SQL Server.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JSON_OBJECT () - Tạo một đối tượng JSON từ danh sách các cặp khóa / giá trị trong MySQL

  2. Làm cách nào để chỉ định ràng buộc duy nhất cho nhiều cột trong MySQL?

  3. Làm cách nào để sửa chữa bảng InnoDB?

  4. Làm cách nào để lấy ID được chèn cuối cùng của bảng MySQL trong PHP?

  5. Làm cách nào để thực hiện chèn hàng loạt trong mySQL bằng node.js